1.Helloworld
利用配置文件(Bean.xml)進(jìn)行類的配置,利用全類名進(jìn)行反射的方式進(jìn)行類的創(chuàng)建
ApplicationContext ctx =new ClassPathXmlApplicationContext("Beans.xml");類路徑下的配置文件
<bean id="helloworld" class="com.HelloWorld.HelloWorld">
? ? <property name="name2" value ="Spring">
</bean>
其中,name的值為setProperty中set后面的值,可與具體變量名不同,即setName2設(shè)置的是name屬性的值。
2.Bean的配置
IOC(Inversion of Control)控制反轉(zhuǎn):反轉(zhuǎn)資源獲取的方向。容器主動地將資源推送給它所管理的組件, 組件所要做的僅是選擇一種合適的方式來接受資源。
DI(Dependency Injection)依賴注入:組件以一些預(yù)先定義好的方式( ( 例如 : setter 方法) ) 接受來自如容器的 資源 注入
2.1 配置bean
class:bean的全類目,通過反射的方式在IOC容器中創(chuàng)建bean,要求bean中必須有無參數(shù)的構(gòu)造器
id:通過id來獲取bean的實例,id值唯一
2.2Spring 提供了兩種類型的 IOC 容器實現(xiàn):
–? BeanFactory: IOC 容器的基本實現(xiàn).面向Spring本身,Spring基礎(chǔ)設(shè)施
–? ApplicationContext: 提供了更多的高級特性. 是 BeanFactory 的子
接口.幾乎所有的應(yīng)用場合都直接使用。面向使用 Spring 框架的開發(fā)
2.3ApplicationContext 代表IOC容器
ApplicationContext 在初始化上下文時就實例化所有單例的 Bean。
實現(xiàn)類:
– ClassPathXmlApplicationContext:從類路徑下加載xml配置文件
– FileSystemXmlApplicationContext: 從文件系統(tǒng)中加載配置文件
2.4獲取Bean的方式
-可通過id獲取
-可通過類的類型獲取,但要求IOC容器中必須只能有一個該類型的Bean
2.5.依賴注入的方式
-屬性的注入:通過setter注入
<property name="name2" value ="Spring"></property>
字面值:可用字符串表示的值,可以通過 <value> 元素標(biāo)簽或 value 屬性進(jìn)行注入。若字面值中包含特殊字符,可以使用 <![CDATA[]]> 把字面值包裹起來。
-構(gòu)造方法注入:通過構(gòu)造器注入,可指定參數(shù)的位置和類型,以區(qū)分重載的構(gòu)造器
<constructor-arg value="audi" index="0"/type="java.lang.String"></constructor-arg>
2.6引用其他的類
-以通過 <ref> 元素或 ref 屬性為 Bean 的屬性或構(gòu)造器參數(shù)指定對 Bean 的引用.
<ref bean="car2"><property name="" ref="car2">
-也可以 在屬性或構(gòu)造器里包含 Bean 的聲明, 這樣的 Bean稱為內(nèi)部 Bean.不用寫id,其他都一樣,不能夠被外部引用,只能在內(nèi)部使用。
2.7為級聯(lián)屬性賦值
屬性需先初始化才可以進(jìn)行賦值,否則異常
<property name ="car.maxspeed" value=""></property>
2.8集合屬性
在 Spring中可以通過一組內(nèi)置的 xml 標(biāo)簽(例如: <list>,<set> 或 <map>) 來配置集合屬性.
</list>
? ? <ref bean="car">
? ? <ref bean="car">
</list>
<map>
<entry key="aa" value-ref="car"></entry>
<entry key="bb" value-ref="car2"></entry>
</map>
<property name="properties">
? ? ? ? <prop key="name">root</prop>
</property>
-配置單例的集合bean,以供多個bean進(jìn)行引用,利用ref=cars可以引用
<util:list id="cars">
? ? <ref bean="car">
</util:list>
2.9 p空間
<bean id="person3" class="com.collection.Person" p:age="30" p:name="hahaha" p:cars-ref="cars">
3.自動裝配
<bean id="person" class="com.autowire.Person" autowire="byName" p:name="hahaha"></bean>
4.Bean 之間的關(guān)系
繼承配置bean:子bean從父bean中繼承配置,也可覆蓋配置
<bean id="address2" p:street="lanbailou" parent="address"></bean>
抽象Bean:只能用來進(jìn)行繼承配置,不能IOC容器被實例化
<bean id="address" class="com.autowire.Address" abstract="true"></bean>
若class屬性沒有指定,則必須為抽象bean,必須指定abstract=true
依賴關(guān)系:
depends-on=“car,person” 前置依賴car和person的bean,需在本bean實例之前創(chuàng)建好
5.Bean的作用域
<bean id="car" class="Car" p:brand="brand" scope="prototype"></bean>
singleton:默認(rèn),單例,容器初始化時創(chuàng)建實例,整個生命周期內(nèi)只創(chuàng)建一個
prototype:只有獲取實例的時候創(chuàng)建新的實例,容器初始化時不創(chuàng)建
6.使用外部屬性文件
<context:property-placeholder location="classpath:db.properties"/>導(dǎo)入資源文件
創(chuàng)建外部文件db.properties?? 文件中內(nèi)容為:price=test_properties
利用<property name="brand" value="${price}"></property>格式調(diào)用
7.spel
value=“#{' hhhh '}”
8.IOC容器中Bean的生命周期
Spring IOC 容器對 Bean 的生命周期進(jìn)行管理的過程:
– 通過構(gòu)造器或工廠方法創(chuàng)建 Bean 實例
– 為 Bean 的屬性設(shè)置值和對其他 Bean 的引用
將 Bean 實例傳遞給 Bean 后置處理器的postProcessBeforeInitialization 方法
–? 調(diào)用 Bean? 的初始化方法
將 Bean 實例傳遞給 Bean 后置處理器的postProcessAfterInitialization方法
– Bean 可以使用了
–? 當(dāng)容器關(guān)閉時,? 調(diào)用 Bean? 的銷毀 方法
Bean的后置處理器
類實現(xiàn)BEANPostProcessor接口,并具體提供以下兩個方法的實現(xiàn)
返回bean,可在方法中修改方法的bean,該處理器適用于所有的bean

不用配置id,ioc自動識別
<bean class="BeanPostProcessor"></bean>
9.通過工廠方法配置Bean
10.通過factoryBean配置Bean
自定義factoryBean需要實現(xiàn)接口
通過factorybean來配置bean的實例,class指向factorybean的全類名
11.配置基于注解的方式
組件掃描(component scanning): Spring 能夠從classpath 下自動掃描, 偵測和實例化具有特定注解的組件.
? 特定組件包括:
– @Component: 基本注解, 標(biāo)識了一個受 Spring 管理的組件
– @Respository: 標(biāo)識持久層組件
– @Service: 標(biāo)識服務(wù)層(業(yè)務(wù)層)組件
– @Controller: 標(biāo)識表現(xiàn)層組件
對于掃描到的組件, Spring 有默認(rèn)的命名策略: 使用非限定類名, 第一個字母小寫.? 也可以在注解中通過 value? 屬性值標(biāo)識組件的名稱。
Spring 的配置文件中聲明:
<context:component-scan base-package="com.annotation" resource-pattern="repository/*.class"></context:component-scan>
兩個屬性:
base-package:掃描包及子包下的文件
resource-pattern:指定路徑的資源
子節(jié)點(diǎn):
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"></context:exclude-filter>指定排除哪些指定表達(dá)式的組件
<context:include-filter type="assignable" expression="接口名(不包含接口和接口所有實現(xiàn)類)"></context:include-filter>只包含表達(dá)式的組件,屬性 use-default-filters=false才起作用
組件裝配:
@Autowired 注解自動裝配 具有兼容類型的單個 Bean屬性
默認(rèn)情況下, 所有使用@Authwired 注解的屬性都需要被設(shè)置. 當(dāng) Spring 找不到匹配的 Bean? 裝配屬性時,? 會拋出異常,? 若某一屬性允許不被設(shè)置,? 可以設(shè)置@ Authwired 注解的 required? 屬性為 false。
當(dāng) IOC 容器里存在多個類型兼容的 Bean 時
1.可通過value設(shè)置為接口名,自動裝配該實現(xiàn)類
2.@Qualifier 注解里提供 Bean 的名稱. Spring 允許對方法的入?yún)?biāo)注 @ Qualifiter 已指定注入 Bean? 的名稱
12.泛型依賴注入
類中包含接口,通過泛型的類型尋找具有同樣泛型類型的實現(xiàn)類

13.AOP 面向切面編程


1.XML文件配置,使注解起作用
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
2.切面:
@Component:把類放入IOC容器中
@Aspect:定義為切面
@Before("execution(public * com.aop.helloworld.*.*(..))")
AspectJ 支持 5 種類型的通知注解:
–? @Before: 前置通知, 在方法執(zhí)行之前執(zhí)行
–? @After: 后置通知, 在方法執(zhí)行之后執(zhí)行,不能訪問返回結(jié)果
–? @ AfterRunning: 返回通知, 在方法返回結(jié)果之后執(zhí)行
–? @ AfterThrowing: 異常通知, 在方法拋出異常之后
–? @Around: 環(huán)繞通知, 圍繞著方法執(zhí)行


環(huán)繞通知:
1.需要攜帶ProceedingJoinPoint類型參數(shù)
2.必須有返回值,返回值即為目標(biāo)方法的返回值

切面優(yōu)先級:
@Order(數(shù)值,值越小,優(yōu)先級越高)
13.2 聲明切入點(diǎn)表達(dá)式
@Pointcut("execution(public * com.aop.helloworld.*.*(..))")
public void declareJoinPointExpression(){}
@Before("declareJoinPointExpression()")其他通知直接使用方法名來引用切入點(diǎn)表達(dá)式
優(yōu)點(diǎn):便于修改切入點(diǎn)表達(dá)式
14.Spring 對Jdbc的使用
配置c3p0數(shù)據(jù)源
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
? ? <property name="driverClassName" value="${jdbc.driverClassName}"/>
? ? <property name="url" value="${jdbc.url}"/>
? ? <property name="username" value="${jdbc.user}"/>
? ? <property name="password" value="${jdbc.password}"/>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"/>VALUES(?,?,?)

<bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate"<constructor-arg ref="dataSource"/>帶參數(shù)VALUES(:lastName,:email,:dpetId)

15.Jdbc中的事務(wù)聲明
事務(wù):一系列動作,單獨(dú)的工作單元。要么全部完成,要么都不完成。
-原子性
-一致性
-隔離性
-持久性
<!--配置事務(wù)管理器管理-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
? ? <property name="dataSource" ref="dataSource">
<!--啟用事務(wù)注解-->
<tx:annotation-driven transaction-manager="transactionManager"/>
注解:
@Transactional
事務(wù)的傳播行為
@Transactional(propagation = Propagation.REQUIRED)
propagation 指定傳播行為,默認(rèn)取值為required,即使用調(diào)用方法的事務(wù)
事務(wù)的隔離級別
@Transactional(isolation = Isolation.DEFAULT)
– 臟讀: 對于兩個事物 T1, T2, T1 讀取了已經(jīng)被 T2 更新但 還沒有被提交的字段. 之后, 若 T2 回滾, T1讀取的內(nèi)容就是臨時且無效的.
– 不可重復(fù)讀:對于兩個事物 T1, T2, T1 讀取了一個字段, 然后 T2 更新了該字段. 之后, T1再次讀取同一個字段, 值就不同了.
– 幻讀:對于兩個事物 T1, T2, T1 從一個表中讀取了一個字段, 然后T2 在該表中插入了一些新的行. 之后, 如果 T1 再次讀取同一個表,就會多出幾行.
回滾事務(wù)屬性
@Transactional(noRollbackFor ={AccountException.class})
默認(rèn)情況下spring的聲明式事務(wù)對所有的運(yùn)行時異常進(jìn)行回滾
只讀屬性:
@Transactional(readOnly =true)只讀數(shù)據(jù)不更新數(shù)據(jù)
超時屬性:
@Transactional(timeout =1)事務(wù)在強(qiáng)制回滾之前可以保持多久. 這樣可以防止長期運(yùn)行的事務(wù)占用資源(秒為單位)