1.Helloworld
利用配置文件(Bean.xml)進行類的配置,利用全類名進行反射的方式進行類的創(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設置的是name屬性的值灾常。
2.Bean的配置
IOC(Inversion of Control)控制反轉(zhuǎn):反轉(zhuǎn)資源獲取的方向。容器主動地將資源推送給它所管理的組件, 組件所要做的僅是選擇一種合適的方式來接受資源啃炸。
DI(Dependency Injection)依賴注入:組件以一些預先定義好的方式( ( 例如 : 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基礎設施
–? ApplicationContext: 提供了更多的高級特性. 是 BeanFactory 的子
接口.幾乎所有的應用場合都直接使用芍锦。面向使用 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> 元素標簽或 value 屬性進行注入次乓。若字面值中包含特殊字符,可以使用 <![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)屬性賦值
屬性需先初始化才可以進行賦值炼鞠,否則異常
<property name ="car.maxspeed" value=""></property>
2.8集合屬性
在 Spring中可以通過一組內(nèi)置的 xml 標簽(例如: <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進行引用,利用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:只能用來進行繼承配置,不能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:默認姿现,單例,容器初始化時創(chuàng)建實例,整個生命周期內(nèi)只創(chuàng)建一個
prototype:只有獲取實例的時候創(chuàng)建新的實例肖抱,容器初始化時不創(chuàng)建
6.使用外部屬性文件
<context:property-placeholder location="classpath:db.properties"/>導入資源文件
創(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 的生命周期進行管理的過程:
– 通過構(gòu)造器或工廠方法創(chuàng)建 Bean 實例
– 為 Bean 的屬性設置值和對其他 Bean 的引用
將 Bean 實例傳遞給 Bean 后置處理器的postProcessBeforeInitialization 方法
–? 調(diào)用 Bean? 的初始化方法
將 Bean 實例傳遞給 Bean 后置處理器的postProcessAfterInitialization方法
– Bean 可以使用了
–? 當容器關(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: 基本注解, 標識了一個受 Spring 管理的組件
– @Respository: 標識持久層組件
– @Service: 標識服務層(業(yè)務層)組件
– @Controller: 標識表現(xiàn)層組件
對于掃描到的組件, Spring 有默認的命名策略: 使用非限定類名, 第一個字母小寫.? 也可以在注解中通過 value? 屬性值標識組件的名稱荤崇。
Spring 的配置文件中聲明:
<context:component-scan base-package="com.annotation" resource-pattern="repository/*.class"></context:component-scan>
兩個屬性:
base-package:掃描包及子包下的文件
resource-pattern:指定路徑的資源
子節(jié)點:
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"></context:exclude-filter>指定排除哪些指定表達式的組件
<context:include-filter type="assignable" expression="接口名(不包含接口和接口所有實現(xiàn)類)"></context:include-filter>只包含表達式的組件拌屏,屬性 use-default-filters=false才起作用
組件裝配:
@Autowired 注解自動裝配 具有兼容類型的單個 Bean屬性
默認情況下, 所有使用@Authwired 注解的屬性都需要被設置. 當 Spring 找不到匹配的 Bean? 裝配屬性時,? 會拋出異常,? 若某一屬性允許不被設置,? 可以設置@ Authwired 注解的 required? 屬性為 false。
當 IOC 容器里存在多個類型兼容的 Bean 時
1.可通過value設置為接口名术荤,自動裝配該實現(xiàn)類
2.@Qualifier 注解里提供 Bean 的名稱. Spring 允許對方法的入?yún)俗?@ 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.必須有返回值焦读,返回值即為目標方法的返回值
切面優(yōu)先級:
@Order(數(shù)值,值越小舱权,優(yōu)先級越高)
13.2 聲明切入點表達式
@Pointcut("execution(public * com.aop.helloworld.*.*(..))")
public void declareJoinPointExpression(){}
@Before("declareJoinPointExpression()")其他通知直接使用方法名來引用切入點表達式
優(yōu)點:便于修改切入點表達式
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中的事務聲明
事務:一系列動作矗晃,單獨的工作單元。要么全部完成刑巧,要么都不完成喧兄。
-原子性
-一致性
-隔離性
-持久性
<!--配置事務管理器管理-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
? ? <property name="dataSource" ref="dataSource">
<!--啟用事務注解-->
<tx:annotation-driven transaction-manager="transactionManager"/>
注解:
@Transactional
事務的傳播行為
@Transactional(propagation = Propagation.REQUIRED)
propagation 指定傳播行為,默認取值為required啊楚,即使用調(diào)用方法的事務
事務的隔離級別
@Transactional(isolation = Isolation.DEFAULT)
– 臟讀: 對于兩個事物 T1, T2, T1 讀取了已經(jīng)被 T2 更新但 還沒有被提交的字段. 之后, 若 T2 回滾, T1讀取的內(nèi)容就是臨時且無效的.
– 不可重復讀:對于兩個事物 T1, T2, T1 讀取了一個字段, 然后 T2 更新了該字段. 之后, T1再次讀取同一個字段, 值就不同了.
– 幻讀:對于兩個事物 T1, T2, T1 從一個表中讀取了一個字段, 然后T2 在該表中插入了一些新的行. 之后, 如果 T1 再次讀取同一個表,就會多出幾行.
回滾事務屬性
@Transactional(noRollbackFor ={AccountException.class})
默認情況下spring的聲明式事務對所有的運行時異常進行回滾
只讀屬性:
@Transactional(readOnly =true)只讀數(shù)據(jù)不更新數(shù)據(jù)
超時屬性:
@Transactional(timeout =1)事務在強制回滾之前可以保持多久. 這樣可以防止長期運行的事務占用資源(秒為單位)