javascript
Spring学习大杂烩(待续)
IOC控制反轉(zhuǎn):
依賴(lài)注入:
需要的jar文件
dist\spring.jar
lib\jakarta-comnons\comnons-logging.jar
lib\aspectj\aspectjweaver.jar
aspectjrt.jar
lib/cglib/cglib nodep2.1_3.jar
lib\j2ee\common-annotation.jar
實(shí)例化Spring容器的方法
ApplicationContext ctx= new ClassPathXmlApplication(new String[]("beans.xml"));
三種實(shí)例化bean的方法
1、使用構(gòu)造器實(shí)例化:(絕大部分都是用該方法)
ApplicationContext ctx= new ClassPathXmlApplication(new String[]("beans.xml"));
<bean id="orderService" class="bean的路徑"></bean>
2、靜態(tài)工廠方法實(shí)例化:
public class OrderFactory{
public static OrderServiceBean createOrder(){
?? return new OrderServiceBean();
}
}
<bean id="orderService" class="工廠類(lèi)路徑" factory-method="工廠類(lèi)方法名稱(chēng)createOrder"></bean>
3、實(shí)例工廠方法實(shí)例化
public class OrderFactory{
public OrderServiceBean createOrder(){
?? return new OrderServiceBean();
}
}
<bean id="orderServiceFactory" class="工廠類(lèi)路徑"></bean>
<bean id="orderService" factory-bean="工廠類(lèi)路徑" factory-method="工廠類(lèi)方法名稱(chēng)createOrder"></bean>
spring容器管理的bean對(duì)象的作用于
1、默認(rèn)情況下是單實(shí)例(同一個(gè)bean);
2、<bean id="orderService" class="bean的路徑" scope="prototye"></bean>添加了scope屬性指定作用域時(shí)可以在每次getBean方法調(diào)用時(shí)生成一個(gè)新的實(shí)例;
spring管理的bean的生命周期
1、在默認(rèn)情況下,在容器實(shí)例化的時(shí)候就對(duì)bean進(jìn)行實(shí)例化了;
2、當(dāng)scope="prototye"時(shí),就在getBean方法時(shí)才實(shí)例化bean;
3、可以在beans.xml文件中設(shè)置lazy-init="true"來(lái)延遲初始化(在容器實(shí)例化的時(shí)候bean不實(shí)例化),實(shí)際中一般不用這個(gè)屬性;
4、可以在beans.xml文件中設(shè)置init-method="方法名稱(chēng)"來(lái)在實(shí)例化bean完成后立刻調(diào)用該方法;
5、可以在beans.xml文件中設(shè)置destroy-method="方法名稱(chēng)"來(lái)在bean銷(xiāo)毀的時(shí)候調(diào)用該方法;(默認(rèn)情況下只有在應(yīng)用關(guān)閉的時(shí)候才會(huì)關(guān)閉spring容器實(shí)例)正常的關(guān)閉方法是:
AbstractApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");(注意是抽象類(lèi))
ctx.close();
依賴(lài)注入
在程序運(yùn)行期間,由外部容器動(dòng)態(tài)的將以來(lái)對(duì)象注入到組件中;
############就是讓容器來(lái)實(shí)例化類(lèi)(被注入的類(lèi)),一定要添加屬性的set方法#########################
注入方法:
1、通過(guò)屬性的setter方法注入:(手動(dòng))
<bean id="personDao" class="business.dao.impl.PersonDaoBean"></bean>
<bean id="personServiceBean" class="businessbeans.impl.PersonServiceBean" init-method="open" destroy-method="destroy">
<property name="pd" ref="personDao"></property>
</bean>
使用bean的構(gòu)造器注入依賴(lài)對(duì)象或基本類(lèi)型
被注入的類(lèi)中需要有構(gòu)造函數(shù),例如
public PersonServiceBean(PersonDao pd, String name) {
?? super();
?? this.pd = pd;
?? this.name = name;
}
2、使用內(nèi)部bean的方式,但該bean不能被其他bean使用:(不常用,手動(dòng))
<bean id="personServiceBean" class="businessbeans.impl.PersonServiceBean" init-method="open" destroy-method="destroy">
?? <property name="pd">
?? <bean id="personDao" class="business.dao.impl.PersonDaoBean"></bean>
</property>
</bean>
3、最優(yōu)雅的依賴(lài)屬性注入方法:使用Field注入(一般用于注解方式,手動(dòng))
添加lib\j2ee\commons-annotation.jar
添加context容器,并打開(kāi)
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xmd
@Autowired默認(rèn)按類(lèi)型匹配 @Resource默認(rèn)按名稱(chēng)匹配,無(wú)匹配名稱(chēng)則按類(lèi)型匹配(推薦Resource方法)
@Resource(可缺省name="")根據(jù)屬性的名稱(chēng)去xml文件中尋找對(duì)應(yīng)的id或name,如果找到直接注入/如果沒(méi)找到匹配屬性的類(lèi)型與xml中配置的類(lèi)型,相同則注入;
可以不寫(xiě)get set方法
自動(dòng)裝配(不推薦使用)
不需要注解,只需要在<bean></bean>標(biāo)簽中添加autowire屬性;必須要有set方法
不同類(lèi)型數(shù)據(jù)的注入
1、類(lèi)類(lèi)型(如上)
2、注入一個(gè)普通屬性(如String name="yanzhexian");
<bean id="personDao" class="business.dao.impl.PersonDaoBean"></bean>
<bean id="personServiceBean" class="businessbeans.impl.PersonServiceBean" init-method="open" destroy-method="destroy">
<property name="pd" ref="personDao"></property>
<property name="name" value="yanzhexian"></property>
</bean>
PS:spring會(huì)自動(dòng)轉(zhuǎn)換注入的普通類(lèi)型到類(lèi)中定義的類(lèi)型
3、注入集合類(lèi)型(set map list等)
set類(lèi)型
<property name="sets">
?? <set>
??? <value>第一個(gè)</value>
??? <value>第二個(gè)</value>
??? <value>第三個(gè)</value>
?? </set>
</property>
list類(lèi)型
<property name="lists">
?? <list>
??? <value>一</value>
??? <value>二</value>
??? <value>三</value>
?? </list>
</property>
property類(lèi)型
<property name="properties">
?? <props>
??? <prop key="key1">value1</prop>
??? <prop key="key2">value2</prop>
??? <prop key="key3">value3</prop>
?? </props>
</property>
Map類(lèi)型
<property name="maps">
?? <map>
??? <entry key="key1" value="value1"></entry>
??? <entry key="key2" value="value2"></entry>
??? <entry key="key3" value="value3"></entry>
?? </map>
</property>
PS:集合類(lèi)型的定義與遍歷
private Set<String> sets=new HashSet<String>();
private List<String> lists= new ArrayList<String>();
private Properties properties =new Properties();
private Map<String,String> maps=new HashMap<String,String>();
??
//嘗試輸出以來(lái)注入的集合屬性sets
?? System.out.println("=======Set======");
?? for(String value:this.getSets()){
??? System.out.println(value);
?? }
//嘗試輸出依賴(lài)注入的list集合屬性lists
?? System.out.println("=======List======");
?? for(String value:this.getLists()){
??? System.out.println(value);
?? }
//嘗試輸出依賴(lài)注入的Properties集合屬性maps
?? System.out.println("=======Properties======");
?? for(String key:this.getProperties().keySet()){
??? System.out.println(key+"="+this.getProperties().get(key));
?? }
??
//嘗試輸出依賴(lài)注入的Map集合屬性maps
?? System.out.println("=======Map======");
?? for(String key:this.getMaps().keySet()){
??? System.out.println(key+"="+this.getMaps().get(key));
?? }
給spring配置文件減肥(在類(lèi)路徑下用自動(dòng)掃描的方式,注,沒(méi)有添加依賴(lài)注入是不會(huì)有依賴(lài)屬性注入的)
1、引入context這個(gè)命名空間和xmd文件
2、<context:component-scan base-package=""></context:component-scan>
3、標(biāo)注@Service業(yè)務(wù)層 @Controller控制層 @Repository DAO層 @Component其他層
@Scope指定作用域范圍 @PostConstruct指定bean初始化方法 @PreDestroy指定容器容器關(guān)閉的方法
4、使用注解時(shí)當(dāng)不指定bean的名稱(chēng),bean的名稱(chēng)就是類(lèi)的簡(jiǎn)單名稱(chēng)(第一個(gè)字母小寫(xiě))
5、可以在注釋后面直接添加名稱(chēng)來(lái)定義bean的名稱(chēng)@Service("NAME");
?
AOP代理對(duì)象(主要是對(duì)權(quán)限管理模塊應(yīng)用)
代理對(duì)象--------目標(biāo)對(duì)象
1、攔截所有業(yè)務(wù)方法,判斷用戶(hù)是否有權(quán)限,有權(quán)限就允許它執(zhí)行業(yè)務(wù)方法,沒(méi)有權(quán)限就不允許它執(zhí)行業(yè)務(wù)方法(是否有權(quán)限根據(jù)user是否為null模擬)
2、用JDK提供的Proxy代理類(lèi)來(lái)創(chuàng)建代理對(duì)象(目標(biāo)對(duì)象必須實(shí)現(xiàn)接口);
如果目標(biāo)對(duì)象沒(méi)有實(shí)現(xiàn)接口
1、引入cglib.jar文件
2、用cglib來(lái)創(chuàng)建代理對(duì)象:
Enhancer enhancer = new Enhance();
enhancer.setSuperclass(this.targetObject.getClass);
enhancer.setCallback(this);
return enhancer.create();
PS:代理類(lèi)一定要實(shí)現(xiàn)MethodInterceptor接口,并通過(guò)該接口來(lái)調(diào)用目標(biāo)類(lèi)中的業(yè)務(wù)方法;
AOP概念:前置通知,后置通知,例外通知,最終通知,環(huán)繞通知
Aspect切面 joinpoint連接點(diǎn)(攔截到的每一個(gè)業(yè)務(wù)方法) pointcut切入點(diǎn)(攔截所有的業(yè)務(wù)方法)
Advice通知() Target目標(biāo)對(duì)象 Weave織入 Introduction引入
用spring進(jìn)行AOP編程:
1、引入jar文件
2、配置配置文件:引入AOP的命名空間,
轉(zhuǎn)載于:https://www.cnblogs.com/yanzhexian/archive/2010/08/17/1801180.html
總結(jié)
以上是生活随笔為你收集整理的Spring学习大杂烩(待续)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: “澄沧入闺景”下一句是什么
- 下一篇: 做一次输卵管通液一般需要多少钱?