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