Spring 2018-10-11

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

init之后和init之前的方法

不用配置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)類

同樣的<User,使UserService和UserRepository配對

13.AOP 面向切面編程

joinPoint參數(shù)訪問到連接細(xì)節(jié)

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)方法的返回值

環(huán)繞通知

切面優(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ù)占用資源(秒為單位)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.1 Spring IoC容器和bean簡介 本章介紹了Spring Framework實現(xiàn)的控制反轉(zhuǎn)(IoC)...
    起名真是難閱讀 2,675評論 0 8
  • 1.1 spring IoC容器和beans的簡介 Spring 框架的最核心基礎(chǔ)的功能是IoC(控制反轉(zhuǎn))容器,...
    simoscode閱讀 6,852評論 2 22
  • 本文是我自己在秋招復(fù)習(xí)時的讀書筆記,整理的知識點(diǎn),也是為了防止忘記,尊重勞動成果,轉(zhuǎn)載注明出處哦!如果你也喜歡,那...
    波波波先森閱讀 12,454評論 6 86
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,662評論 19 139
  • 不知從什么時候,就愛上了文字里的委婉和瀟逸。在那輕靈的文字里暢游,心是愉悅的。 和你的遇見,讓我記憶猶新。是...
    信步云天閱讀 284評論 0 3

友情鏈接更多精彩內(nèi)容