1. 程式人生 > >Spring基礎總結

Spring基礎總結

DI基本操作 setter注入 基本註解 通知器的xml配置 通知器註解的配置

			**************DI的基本操作**************

啟動Spring容器,載入配置檔案 ClassPathXmlApplicationContext cp=new ClassPathXmlApplicationContext(“xml檔案路徑”); 從spring容器中獲得物件 getBean(“bean的name”);

			**************setter注入**************

給物件起別名 1.在bean中加入name標籤,可寫多個 2.在bean中的id中,寫,但只能寫一個 3.在外面配置標籤<alias name="" alias="">

給構建的物件賦值 1.在<property>標籤中配置name、value屬性賦值(限基本資料型別/String) 2.在<property>標籤中配置name、ref,ref指向其他bean標籤(可通過bean標籤中的構造器傳參) 3.不配置values,在標籤裡面寫 <ref bean="" /> 或 <bean class="">或 <ref local="" />有的版本支援

集合裝配進物件內 在<property name=“去掉set名”>配置 1.array---------<array><value> 或<list><value> 2.list----------<array><value> 或 <list><value> 3.set-----------<set><value> 4.map-----------<map><entry key="" value=""> 5.properties----<prop key="">

構造器裝配 不寫value時可用ref或在裡面再巢狀<bean> 1.基於角標:<constructor-arg index="" value=""></constructor-arg> 2.基於型別:<constructor-arg type="" value=""></constructor-arg> 3.基於構造器變數名:<constructor-arg name="" value=""></constructor-arg> 4.上述三種結合使用

自動裝配 autowire="" 1.byType:相同型別僅出現一次,set方式的引數型別 2.byName:全域性變數的set方法去掉set 首字母小寫去bean找 3.default:預設,跟一級標籤beans中deafult-autowire屬性結合使用

4.no:不匹配,一級標籤beans不起作用 5.construct:基於構造器,先型別再引數名字

繼承裝配 在父類模板中bean中加abstract="true"通知spring不構建物件,子標籤中parent=“父標籤name”

自定義屬性編輯器 eg. 字串->自定義類 1.實現PropertiesEditor介面重寫setAsText方法 2.通知spring,在xml中加入特殊bean,spring自動搜尋裝配(editor.xml) org.springframework.beans.factory.config.CustomEditorConfigurer

建立bean例項的方式 1.通過構造器(有參/無參):bean方式 2.通過靜態工廠:spring代建工廠例項,bean標籤中加入factory-methond=“靜態方法全名” spring見該屬性自動類名.方法 3.通過例項工廠:<bean name="" factory-bean=“工廠bean中的name” factory-method=“工廠中方法”> 4.bean實現spring提供FactoryBean介面,是則呼叫getObject方法返回物件 (spring提供了倆讀取properties檔案的類,加入後可直接${key}取 springFac.xml) org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer org.springframework.beans.factory.config.PropertyPlaceholderConfigurer

Spring的生命週期 bean中寫入class所對應類中的初始化init和銷燬destory方法即init-method="“和destory-method=”"

			   **************基本註解**************

註解構建 1.正常情況:<property name="" ref=""> 2.自動裝配:<bean autowire=""> 3.給類的自定義屬性的set方法上加 @Autowire註解,再告訴spring<bean class=“特殊類全限定名”>去掃描 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor 4.先加context約束 <context:annotation-config></context:annotation-config>相當於寫了上述共4類bean標籤,掃描當前xml中class中的類 他會檢查 @Autowired @Resource @PostConstruct @PreDestory @Required等註解

註解-語義(查詢順序)-可標記位置-引數
@AutoWire-自動裝配(先基於型別再基於引數名)-set方法/全域性變數/構造器-(required=true/false)
@Qualifier-指定注入bean的名字-set方法上或引數前,引數名/構造器引數型別前/全域性變數前或上-(name="" type="")
	生效順序:set->全域性變數->構造器
@Resource-資源(預設先基於名字set方法去set,找不到再型別)-set方法上/全域性變數上-(name="" type="映象")  以上是spring提供註解,該註解由jdk提供

此時的<context:annotation-config>標籤無用,代替的是<context:component-scan base-package="com.briup.bean"> 
@Component-元件(自動構建物件,無需配bean)-類上面-value="bean名字"
	區分web專案層次用的
	@Controller   web
	@Service      service
	@Respository  dao層
@Value("賦值")-基本資料型別,String賦值-set方法/全域性變數
@Scope-構建單例-類上面-"singleton/prototype"
@PostConstruct-初始化方法上-構建物件呼叫的方法
@PreDestory-銷燬的方法-從spring移除時呼叫的(單例可銷燬)

靜態代理: 代理跟目標方法實現相同介面,在代理方法中加入操作 再 呼叫目標方法, jdk代理: 前提是目標類必須實現介面 Proxy.newProxyInstance(類載入器,介面映象,處理器) 方法一:不構建工廠:處理器:實現InvocationHandler介面,核心方法invoke(代理物件,方法映象,方法引數) 方法二:spring幫我們管理jdk工廠:實現FactoryBean介面,核心方法getObject() cglib代理: 解決了沒有介面的目標物件 工廠實現了MethodInterceptor介面 方法一:CglibProxyTest cp=new CglibproxyTest(); cp.getProxy(目標物件的映象); 方法二:CglibProxyTest cp=new CglibProxyTest(); cp.setTarget(目標物件); 方法三:將方法二交由spring管理,spring管理工廠無法傳參,故用方法二 <bean name="" factory-bean=“工廠物件” factory-method=“工廠中呼叫的方法”></bean>

			  **************通知器的xml配置**************

編寫xml的通知

前置通知: 介面MethodBeforeAdvice <bean class=“org.springframework.aop.framework.ProxyFactoryBean”> <property name=“target” ref=“目標物件”> <property name=“interfaces”><array><value>目標物件實現的所有介面</value></array> 無介面該步可忽略,cglib代構建 <property name=“interceptorNames”><array><value>通知器/增強器的目標bean</value></array>

後置通知: 介面AfterReturningAdvice 配法跟以前一樣

環繞通知: 介面MethodInterceptor,呼叫引數的proceed()方法 配法跟以前一樣

異常通知: 介面ThrowsAdvice 配法跟以前一樣

增強器(切面+通知): 增強器配置:<bean class=“org.springframework.aop.support.RegexpMethodPointcutAdvisor”> <property name=“advice” ref=""> <property name=“patterns”><array><value>.save.</value> 工廠:<bean name=“proxy” class=“org.springframework.aop.framework.ProxyFactoryBean”> <property name=“target” ref=“目標物件”> <property name=“interfaces”><array><value>目標物件實現的所有介面</value></array> 無介面該步可忽略,cglib代構建 <property name=“interceptorNames”><array><value>通知器/增強器的目標bean</value></array>

自動增強器: <bean class=“org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator”></bean> 會自動基於bean標籤的class掃描新增增強器(advisor>=1)

多代理: <bean class=“org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator”> <property name=“beanNames”><array><value>目標物件bean的名字 <property name=“interceptorNames”><array><value>增強器/代理器bean名字 基於beanNames去新增攔截器

aop專用標籤: <aop:config proxy-target-class=“false/true”> jdk代理-false / cglib代理-true 切面配置:<aop:pointcut expression=“execution(* com.briup.IOC.pojo..save(…))” id=“mypointcut”/> 增強器配置:<aop:advisor advice-ref=“around” pointcut-ref=“mypointcut”/> 也可以用pointcut=“execution(* com.briup.IOC.pojo..save(…))”

自定義aop標籤: <aop:config> 指定切面:<aop:pointcut expression=“execution(* com.briup.IOC.pojo..save(…))” id=“mypointcut”/> <aop:aspect ref=“自定義通知類bean名字”> 前置通知:<aop:before method=“自定義通知類的方法名” pointcut-ref=“切面”/> 後置通知:<aop:after method=“自定義通知類的方法名” pointcut-ref=“切面”/> 無論如何都通知 <aop:after-returning method=“自定義通知類的方法名” pointcut-ref=“切面”/> 正常返回後的通知 環繞通知:<aop:around method=“自定義通知類的方法名” pointcut-ref=“切面”/> 異常通知:<aop:after-throwing method=“自定義通知類的方法名” pointcut-ref=“切面” throwing=“方法引數異常的引數名”/> 自定義發放中:前後置通知引數JoinPoint; 環繞通知ProceedingJoinPoint; 異常通知:JoinPoint和Exception

			   **************通知器註解的配置**************

註解配置通知 類上: @Component 讓spring構建物件無需配置bean標籤 @Aspect 該類中的所有方法均作用於切面

自定義空方法: @Ponitcut("executu(切面)")  該方法解釋為了讓該註解生效
前置通知: @Before(value="切面所指向空方法的名字")
後置通知: @After(value="切面所指向空方法的名字")
後置返回通知: @AfterReturning(value="切面所指向空方法的名字")
環繞通知: @Around(value="切面所指向空方法的名字")
異常通知: @AfterThrowing(value="切面所指向空方法的名字",throwing="異常引數名")

大致總結,如有不足之處,望留言指正。