加載相應jar包或座標(maven):spring-context,spring-core,spring-beans,spring-expression,commons-logging,lombokjava
寫一個實體類。而後定義一個spring的xml文件,默認取名爲applicationContext.xmlmysql
xml中:spring
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="對這個bean取一個惟一名" class="全限定類名" scope="單例或多例模式" autowire="自動裝配"> <property name="實體類的屬性名" value="實體類相應屬性的值"></property> <property name="實體類的屬性名" ref="引用當前spring管理的對象"></property> (property是根據你實體類的set方法後跟的屬性名來賦值的 例:setId(Interger id) 你的name填Id就會調用你的這個set方法而不是根據你的屬性名 或者使用 <constructor-arg value="須要賦的值" index="第幾個參數" type="參數類型"></constructor-arg> (構造方法注入) </bean> 若是加入了p命名空間,就能夠直接使用p:屬性名賦值 <bean id="惟一id值" class="全限定類名" p:屬性名=""> <bean><property><bean>內部bean,能夠看做局部變量</bean></property></bean> </beans>
Test類:sql
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");加載文件 World world = (實體類)ac.getBean("bean的id"); ac.getBean(class);要求bean管理的此類對象只有一個 ac.getBean("bean的id",class)第三種方法更加精確不須要強轉類型
成功使用spring的容器加載類。這也就實現了所謂的IOC控制反轉,將由程序控制管理的類交由Spring去管理,咱們不須要關心它是如何被建立出來的數據庫
工廠bean模式:express
public class MyFactory implements FactoryBean<World> { public World getObject() throws Exception { World world = new World(); world.setName("Hello World!"); return world; } public Class<?> getObjectType() { return World.class; } public boolean isSingleton() { return false; } }
繼承FactoryBean,實現其中方法編程
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="factory" class="com.spring.MyFactory"></bean> </beans>
配置文件改成獲得這個工廠,而後一樣測試就能夠直接獲得這個對象,這是工廠建立併發
bean的生命週期:經過容器或者工廠建立bean實例—爲bean設置屬性—調用初始化方法—bean可使用—容器關閉並銷燬beanapp
若是實現了BeanPostProcessor會增長兩個時期,分別在bean實例初始化先後框架
加載外部配置文件
<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer"> <property name="location" value="classpath:"></property> </bean> 或 <context:property-placeholder location="classpath:"></context:property-placeholder>
普通組件:@Component 持久層組件:@Repository 業務邏輯層:@Service 控制層:@Controller
需添加掃描
<context:component-scan base-package="相應包"> <context:include-filter type="annotation" expression="註解的全限定類名"/> <context:exclude-filter type="assignable" expression="類型的全限定類名"/> </context:component-scan>
@Autowired 自動裝配。@Qqualifier(value="beanid")指定相應bean
以前咱們業務代碼中會有不少公共部分,通常會使用動態代理的方法從而實現從業務代碼將公共功能抽取出來
oop:縱向繼承機制 aop:橫向抽取機制
橫切關注點:從每一個業務方法中抽取的非核心業務
切面:封裝橫切關注點信息的類,每一個關注點體現爲一個通知方法
通知:切面必需要完成的各個具體工做
目標:被通知的對象,做用到的對象
代理:向目標對象應用通知以後建立的代理對象
鏈接點:從橫切關注點抽取的某個特定位置
切入點:找到相應鏈接點的位置,是一個條件。就比如數據庫鏈接點是數據中的記錄,切入點就是查詢條件
加載相應jar包或座標(maven):spring-aop,aspectjweaver,aopalliance,spring-aspects,cglib
這裏面用到了Aspectj,這是對面向切面編程的框架使用註解實現
編寫切面類,加入註解@Component(ioc注入),@Aspect(標記爲切面類)@Order(值越小優先級越高)(切面優先級)
全部的通知註解中需加入(value="切入點表達式,execution(訪問修飾符和返回值 全限定類名.方法.(參數)),其中的參數能夠用*表明全部"),
方法上注入@Before表明前置通知,
@After後置通知 做用於方法的finally語句塊
@AfterReturning返回通知 在註解中能夠加入returning=「result」參數,至關於接收到了原來方法的返回值,而後就能夠在方法中加入Object 「result」參數得到剛纔獲得的返回值,做用於方法執行以後
@AfterThrowing異常通知,在註解中能夠加入 throwing=「ex」 ,方法中能夠加入Exeption ex 獲取異常的信息,也能夠在方法中放入相應的異常實現指定異常處理
@Around環繞通知 方法中需加入ProceedingJoinPoint參數 proceed()方法至關於執行方法,進行try,catch至關於動態代理模式的實如今裏面添加前置後置,異常返回通知
若是有公共的切入點就能夠在一個方法上定義@Pointcut加入以前註解中value需加入的值,而後其餘的通知註解中的value直接放這個方法名就行。
方法中能夠寫JoinPoint joinPoint參數 joinPoint.getArgs()獲取方法參數.getSignature().geName()獲取方法名
xml加入:<aop:aspectj-autoproxy />表示啓用切面
<aop:config> <aop:aspect id="" order="" ref="切面bean的引用,引用其名字"> <aop:before method="對應的方法" pointcut="切入點表達式"></aop:before> <aop:after method="" pointcut=""></aop:after> <aop:after-returning method="" pointcut=""></aop:after-returning> <aop:after-throwing method="" pointcut=""></aop:after-throwing> </aop:aspect> </aop:config>
<aop:config> <aop:aspect> <aop:pointcut id="" expression=""/> <aop:before method="" pointcut-ref="引用"></aop:before> </aop:aspect> </aop:config>
引入配置文件 <context:property-placeholder location="db.properties"></context:property-placeholder> 建立數據源 <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="${jdbc.driver}"></property> <property name="url" value="${jdbc.url}"></property> <property name="username" value="${jdbc.username}"></property> <property name="password" value="${jdbc.password}"></property> </bean> 經過數據源配置jdbctemplate <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"></property> </bean>
JdbcTemplate中封裝jdbc的操做
<bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>
能夠加到方法上或者類上
其中能夠設置的屬性
propagatino:事物的傳播級別/行爲,A和B方法都有事務,在A調用B時,會將A中的事務傳播給B方法,B方法對於事務的處理方式就是事務的傳播行爲
Propagation.REQUIRED:必須使用調用者的事務
Propagation.REQUIRES_NEW:不是用調用者的事務,使用新的事務進行處理
Propagation.SUPPORTS:A中有事務則用沒有事務則不用事務
Propagation.NOT_SUPPORTED:當前方法不運行在事務中
Propagation.MANDATORY:當前方法必須運行在事務內,不然直接拋出異常
Propagation.NEVER:當前方法不該該運行在事務中,若是有事務則拋出異常
Propagation.NESTED:若是當前存在事務,則在嵌套事務內執行。若是當前沒有事務,則進行與PROPAGATION_REQUIRED相似的操做。
isolation:事務的隔離級別,在併發的狀況下,操做數據的一種規定
讀未提交:髒讀,可能會讀到會回滾的無心義的數據
讀已提交:不可重複讀
可重複讀:幻讀,正在讀時的數據不容許更新和操做
串行化:至關於單線程,一次只能處理一件事情,性能較低,消耗較大
timeout:在事務強制回滾前最多能夠執行(等待)多長時間
readyonly:指定當前事務中的系列操做是否爲只讀,默認爲false若是是隻讀做用提醒mysql不須要加鎖
rollbackfor|rollbackforclassname|norollbackfor|norollbackforclassname:由於什麼異常或者不由於什麼異常而回滾
<bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <aop:config> <aop:pointcut id="pointcut" expression="切入點表達式"/> <aop:advisor advice-ref="tx" pointcut-ref="pointcut"/> </aop:config> <tx:advice id="tx" transaction-manager="dataSourceTransactionManager"> <tx:attributes> <tx:method name=""/> 可使用通配符 </tx:attributes> </tx:advice>