Java學習筆記(二十九):spring

spring配置

1. 分層的 Java SE/EE 框架

2. 內核:ioc、aop

ioc具體實現:依賴注入

aop具體實現:

3. 技術:持久層 Spring JDBCTemplate、業務層 事務管理、展示層 Spring MVC

4. 過程:spring框架 讀取xml文件,通過反射創建bean對象,返回對象

5. <bean>的屬性:

id  ---唯一

class  ---類全名稱

scope  ---範圍:singleton單例(讀取xml文件時創建bean)、prototype多例(getBean時創建)

init-method  ---指定初始化方法

destory-method  ---指定銷燬方法

------默認無參構造方法初始化bean,工廠方式初始化bean時需要自定義一個工廠類,寫個getDao方法

  factory-method  ---靜態工廠 方式 初始化bean(class自定義的工廠類)

  factory-bean  ---動態工廠方式初始化bean(factory-bean="工廠類的beanid"  factory-method="getDao")

6. 依賴注入:control層 只使用 service,service又依賴dao;所以再spring容器內部將dao注入service

帶參構造方法:service中定義:dao的私有變量、帶參(dao)的構造方法

                           xml:<consturctor-arg  name="參數名"  ref="dao的id">

set方法:service中定義:dao的私有變量、dao的set方法

                 xml:<property  name="屬性名"  ref="dao的id">

補充:property可以改爲屬性p:userDao-ref="xxx",需要引入p命名空間

7. set注入其它類型:

普通類型:<property  name="屬性名"  value="值">

引用類型:property的字標籤:

                   <list>  <value>值</value>(引用:<ref>引用的id值</ref>) ......</list>

                   <map>  <entry  key="key值"   value-ref="引用的id值"> </entry> .......</map>

                   <props>  <prop  key="key值"> value值 </prop> .......</props>

引用的賦值:在配置對應的bean時(如user的bean),用property賦好值

8. 在主配置文件中引入其它配置文件:<import  resource="xxx.xml">

9. API

接口:ApplicationContext

實現類:ClassPathXml......  從類的根目錄下加載配置文件

                FileSystemXml.......  從磁盤加載配置文件

                AnnotationConfig......  讀取註解,用註解配置容器對象

方法:getBean

getBean的參數:String類型:id名

                              Class<T>類型:類的字節碼(這個類型在容器中只有一個bean)

10. 配置數據源

.properties配置文件中配置連接信息

.xml配置文件中讀取連接信息,將數據源(如 DruidDataSource)注入Spring容器

使用:DataSource dataSource = app.getBean(DataSource.class);

//補充:讀取properties配置文件的方法之一
ResourceBundle rb = ResourceBundle.getBundle("jdbc"); //配置文件名
String str=rb.getString("key的名")
//xml配置文件

    <context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>

    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${driverClassName}"></property>
        <property name="url" value="${url}"></property>
        <property name="username" value="${username}"></property>
        <property name="password" value="${password}"></property>
        <property name="initialSize" value="${initialSize}"></property>
        <property name="maxActive" value="${maxActive}"></property>
        <property name="maxWait" value="${maxWait}"></property>
    </bean>
//使用
DataSource dataSource = app.getBean(DataSource.class);

spring註解

1. 需要在xml中配置組建掃描:<context:component-scan base-package="該包及其子包" />

2. 原始註解:代替bean

@Component ---類上,放入容器(對應三個語義化註解:@Controller、@Service、@Repository)

@Scope ---類上,作用範圍

@PostConstruct ---方法上,初始化方法;@PreDestory ---方法上,銷燬方法

@Value ---變量上,普通變量注入,("變量值 / ${key的值}")

@Autowired ---變量上,引用注入,根據類型注入

@Qualifier ---變量上,引用注入,根據名稱注入(與Autowired一起用),可省略set方法

@Resource ---變量上,引用注入,等於Autowired+Qualifier,(name="名")

3. 新註解

@Configuration ---類上,總配置類

@ComponentScan ---類上,組建掃描,("包")

@PropertySource ---類上,加載.properties文件,("classpath:jdbc.properties")

@Import ---類上,導入配置類,({xx.class,...})

@Bean ---方法上,方法返回值存到spring容器中,("指定名稱"),例如:返回dataSource

4. 整合Junit

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
//@ContextConfiguration(classes={SpringConfiguration.class})
public class SpringTest {

    @Autowired
    private UserService userService;

    @Test
    public void test01(){
        userService.out();
    }
}

spring的aop

1. aop:面向切面編程;是通過預編譯的方式和運行期動態代理實現程序功能的統一維護的一種技術

              是oop(面向對象編程)的延續

             aop是一種思想,spring框架對aop思想進行實現,aspectj框架也對aop思想進行實現,且性能更好

2. 底層實現:動態代理技術(自動實現)

JDK代理:基於接口

cglib代理:基於類

spring監聽切點的執行,切點被執行---使用代理機制,動態創建目標對象和代理對象---根據通知類別,在代理對象的對應位置,將通知對應的功能織入

3. 一些名詞:

目標對象、代理、連接點(可以被增強的方法)、切入點(切點;真正被增強的方法)

通知/增強(增加的代碼)、切面(目標方法+增加的代碼;切點+通知)

織入(將切面和增強結合到一起的過程)

4. xml方式:

    <!--配置織入-->
    <aop:config>
        <aop:aspect ref="myaspect"> <!--切面類id-->
            <!--切點表達式 : 類型 包.類.方法(參數)-->
            <aop:pointcut id="be" expression="execution(* service.impl.*.*(..))"></aop:pointcut>
            <!--before 前置增強-->
            <aop:before method="outBefore" pointcut-ref="be"></aop:before>
        </aop:aspect>
    </aop:config>

before 前置、after-returning 後置、around 前(切點方法)後(方法返回值)、throwing 異常、after 最後(無論有無異常)

around參數:ProceedingJoinPoint 切點,可以用它調用切點方法

5. 註解方式:

加AOP自動代理:<aop:aspectj-autoproxy />

@Aspect 切面類

@Before、@AfterReturning、......  ("切點表達式")或者("類.方法()")

@PointCut("切點表達式")  用在一個空方法上,是表達式抽取

 

Spring JDBCTemplate

1. new JdbcTemplate()-->xml <bean>

  setDataSource(ds)-->set注入

 

事務控制

1. 聲明式事務控制:xml、註解

              底層就是aop

              看作切面:切點--業務方法,通知--事務控制(開啓事務、提交、回滾)

    <!--平臺事務管理器-->
    <bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    <!--事務-->
    <tx:advice id="interceptor" transaction-manager="dataSourceTransactionManager">
        <!--針對各個業務方法,設置事務的屬性信息-->
        <tx:attributes>
            <!--方法名、*、方法名*-->
            <tx:method name="*" isolation="DEFAULT" propagation="REQUIRED" timeout="-1" read-only="false"/>
        </tx:attributes>
    </tx:advice>
    <!--事務 配置織入-->
    <aop:config>
        <!--事務專用-->
        <aop:advisor advice-ref="interceptor" pointcut="execution(* service.impl.*.*(..))"></aop:advisor>
    </aop:config>

2. 註解:@Transactional  類上--針對所有方法,方法上--優先

    xml寫註解驅動

<tx:annotation-driven transaction-manager="dataSourceTransactionManager"></tx:annotation-driven>

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章