Spring框架的全面理解
Spring是一個輕量級的應用框架,可以簡化企業(yè)級開發(fā),降低侵入性;Spring的本質(zhì)是管理軟件中的對象,創(chuàng)建對象和維護對象之間的關系;Spring提供IOC和AOP功能,可以降低組件的耦合度;便于系統(tǒng)的維護和升級;
Spring容器的種類有兩種:BeanFactory(父接口)和ApplicationContext(子接口);ApplicationContext擁有較多的企業(yè)及方法,推薦使用ApplicationContext接口;
BeanFactory和ApplicationContext是維護Bean和相互依賴的高級工廠接口;調(diào)用getBean("id名")方法獲取bean的實例;
Spring容器的實例化(也叫啟動容器):ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContextr.xml");
Spring容器創(chuàng)建Bean對象的3種方法;
方法一:重點是用構(gòu)造器來實例化;
方法二;使用靜態(tài)工廠的方法來實例化;
方法三:使用實例工廠的方法來實例化;
方法一:<bean id="xxxx" class="xxx.xx.xx"/>或者
<bean name="xxxx" class="xxx.xx.xx"/>
id或name用于指定Bean的屬性,class用于指定Bean的類型,會自動調(diào)用無參數(shù)構(gòu)造器來創(chuàng)建對象;
方法二:<bean id="xxxx" class="xxx.xx.xx" factory-method="靜態(tài)方法名,不含括號"/>
id用于指定Bean的屬性;
class用于指定工廠中創(chuàng)建Bean對象的靜態(tài)方法;必須是static修飾的靜態(tài)方法;
方法三:<bean id="xxx1" class="xxx.xx.xx"/>
<bean id="xxx2" factory-bean="xxx1"
factory-method="靜態(tài)方法名,不含括號"/>
factory-method屬性用于指定共產(chǎn)共
id或name用于指定Bean的屬性,class用于指定Bean的類型,會自動調(diào)用
id或name用于指定Bean的屬性;
id用于指定Bean的屬性;
factory-bean屬性用于指定工廠Bean對象;
factory-method屬性用于指定工廠中創(chuàng)建的Bean靜態(tài)方法;
bean的作用域:默認的情況下,一個bean配置,容器只會創(chuàng)建一個實例;
可以通過scope屬性,調(diào)用getBean()方法創(chuàng)建新的實例;scope="prototype";
bean的延遲加載:添加lazy-init=true;
bean的生命周期:
指定初始化回調(diào)方法:<bean id="xxx" class="xx.xx.xx" init-method="init"/>
指定銷毀回調(diào)方法:僅適用于單例singleton模式的bean;<bean id="xxx" class="xx.xx.xx" destroy-method="destroy"/>
Bean的作用域:默認的情況下,一個bean陪
IOC
IOC是Inversion of Control控制反轉(zhuǎn);是指由最初的new方式創(chuàng)建對象轉(zhuǎn)變?yōu)榈谌娇蚣軇?chuàng)建對象,注入DI,降低了對象之間的耦合度;
spring容器采用了依賴注入的方式實現(xiàn)了IOC控制反轉(zhuǎn);
DI稱為Dependency Injection依賴注入;
依賴注入的原理是:將具有關系的對象,通過構(gòu)造器方法參數(shù)或方法參數(shù)傳入簡歷關聯(lián);
IOC是一種思想,DI是實現(xiàn)IOC的主要技術途徑;
注入對象:
DI注入對象的方式setter注入,構(gòu)造器注入,接口注入;其中接口注入最常用;
Spring IOC容器也可以自動裝配;默認的時候是禁止自動裝配的;autowire="no";
autowire的值:no,byName,byType,constructor,autodetect;
注入?yún)?shù)的值:
1.注入基本類型的值和集合類型的值;
<bean id="xxx" xlass="xxx.xxx.xxx">
<property name="xxx" value="xxxx"/>
</bean>
2.引用的方式注入外部的bean,方便重用;
<bean id="xxx1" xlass="xxx.xxx.xxx1">
<property name="xxx" value="xxxx"/>
</bean>
<bean id="xxx" xlass="xxx.xxx.xxx2">
<property name="xxx" ref="xxx1"/>
</bean>
3.注入Spring表達式的值;
<util:properties id="xxx" location="classpath:文件名"></util>
<bean id="xxx" class="xx.xx.xx">
<property name="xxx" value="#{xx.屬性}"/>
<property name="xxx" value="#{xx.屬性}"/>
<property name="xxx" value="#{xx.屬性}"/>
</bean>
4.注入Null或空字符串
<bean id="xxx" xlass="xxx.xxx.xxx2">
<property name="xxx" value=""/>
</bean>
注入Null
<bean id="xxx" xlass="xxx.xxx.xxx2">
<property name="xxx">
<null/>
<property/>
</bean>
基于注解的組件掃描:
指定一個包路徑,Spring會自動掃描該包及其子包所有組件.當發(fā)現(xiàn)組件類,前有特定的注解標記的時候,將該組件納入到Spring容器中;等價于XML中配置的<bean>定義;
<context:component-scan base-package="org.xxx.xxx"/>
在類名前面添加注解;
@Component或@Named 通用注解
@Repository 持久層注解
@Service 業(yè)務層注解
@Controller 控制層注解
@Scope("prototype") 組件作用域注解
@Lazy(true) 延遲加載注解,只有調(diào)用getBean()方法才會調(diào)用;
類前面的注解,注解后面緊跟的id默認為該類名的首字母小寫;也可以不寫;
@Component(id="example")
public class Example implements Serializable{
}
在方法前面添加的注解
@PostConstruct指定初始化方法的注解
@PreDestroy指定銷毀毀掉方法的注解
指定依賴注入的關系
@Autowired寫在方法的前面,聲明需要為方法注入bean; @Autowired適用于setter注入和構(gòu)造器注入;不用導包;
@Resource只適用于setter注入;
如果注入的是對象是單例的,@Resource(name="注入的類名首字母小寫"),(name="")可以省略;
@Inject或者@Named 適用于setter注入和構(gòu)造器注入,需要額外導入包;不推薦使用;
在方法中的參數(shù)前面添加的注解
@Qualifier 聲明需要注入的bean的id;如果注入的對象是單例,@Qualifier可以省略不寫;
注入Spring表達式值;
在屬性或者setter方法前面使用@Value("#{const.PAGE_SIZE}");
@Value("Nihao")也可以注入基本類型的值;