Spring框架的全面理解
Spring是一個輕量級的應用框架,可以簡化企業級開發,降低侵入性;Spring的本質是管理軟件中的對象,創建對象和維護對象之間的關係;Spring提供IOC和AOP功能,可以降低組件的耦合度;便於系統的維護和升級;
Spring容器的種類有兩種:BeanFactory(父接口)和ApplicationContext(子接口);ApplicationContext擁有較多的企業及方法,推薦使用ApplicationContext接口;
BeanFactory和ApplicationContext是維護Bean和相互依賴的高級工廠接口;調用getBean("id名")方法獲取bean的實例;
Spring容器的實例化(也叫啓動容器):ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContextr.xml");
Spring容器創建Bean對象的3種方法;
方法一:重點是用構造器來實例化;
方法二;使用靜態工廠的方法來實例化;
方法三:使用實例工廠的方法來實例化;
方法一:<bean id="xxxx" class="xxx.xx.xx"/>或者
<bean name="xxxx" class="xxx.xx.xx"/>
id或name用於指定Bean的屬性,class用於指定Bean的類型,會自動調用無參數構造器來創建對象;
方法二:<bean id="xxxx" class="xxx.xx.xx" factory-method="靜態方法名,不含括號"/>
id用於指定Bean的屬性;
class用於指定工廠中創建Bean對象的靜態方法;必須是static修飾的靜態方法;
如果你想學習Java可以來這個羣,首先是二二零,中間是一四二,最後是九零六,裏面有大量的學習資料可以下載。
方法三:<bean id="xxx1" class="xxx.xx.xx"/>
<bean id="xxx2" factory-bean="xxx1"
factory-method="靜態方法名,不含括號"/>
factory-method屬性用於指定共產共
id或name用於指定Bean的屬性,class用於指定Bean的類型,會自動調用
id或name用於指定Bean的屬性;
id用於指定Bean的屬性;
factory-bean屬性用於指定工廠Bean對象;
factory-method屬性用於指定工廠中創建的Bean靜態方法;
bean的作用域:默認的情況下,一個bean配置,容器只會創建一個實例;
可以通過scope屬性,調用getBean()方法創建新的實例;scope="prototype";
bean的延遲加載:添加lazy-init=true;
bean的生命週期:
指定初始化回調方法:<bean id="xxx" class="xx.xx.xx" init-method="init"/>
指定銷燬回調方法:僅適用於單例singleton模式的bean;<bean id="xxx" class="xx.xx.xx" destroy-method="destroy"/>
Bean的作用域:默認的情況下,一個bean陪
IOC
IOC是Inversion of Control控制反轉;是指由最初的new方式創建對象轉變爲第三方框架創建對象,注入DI,降低了對象之間的耦合度;
spring容器採用了依賴注入的方式實現了IOC控制反轉;
DI稱爲Dependency Injection依賴注入;
依賴注入的原理是:將具有關係的對象,通過構造器方法參數或方法參數傳入簡歷關聯;
IOC是一種思想,DI是實現IOC的主要技術途徑;
注入對象:
DI注入對象的方式setter注入,構造器注入,接口注入;其中接口注入最常用;
Spring IOC容器也可以自動裝配;默認的時候是禁止自動裝配的;autowire="no";
autowire的值:no,byName,byType,constructor,autodetect;
注入參數的值:
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會自動掃描該包及其子包所有組件.當發現組件類,前有特定的註解標記的時候,將該組件納入到Spring容器中;等價於XML中配置的<bean>定義;
<context:component-scan base-package="org.xxx.xxx"/>
在類名前面添加註解;
@Component或@Named 通用註解
@Repository 持久層註解
@Service 業務層註解
@Controller 控制層註解
@Scope("prototype") 組件作用域註解
@Lazy(true) 延遲加載註解,只有調用getBean()方法纔會調用;
類前面的註解,註解後面緊跟的id默認爲該類名的首字母小寫;也可以不寫;
@Component(id="example")
public class Example implements Serializable{
}
在方法前面添加的註解
@PostConstruct指定初始化方法的註解
@PreDestroy指定銷燬毀掉方法的註解
指定依賴注入的關係
@Autowired寫在方法的前面,聲明需要爲方法注入bean; @Autowired適用於setter注入和構造器注入;不用導包;
@Resource只適用於setter注入;
如果注入的是對象是單例的,@Resource(name="注入的類名首字母小寫"),(name="")可以省略;
@Inject或者@Named 適用於setter注入和構造器注入,需要額外導入包;不推薦使用;
在方法中的參數前面添加的註解
@Qualifier 聲明需要注入的bean的id;如果注入的對象是單例,@Qualifier可以省略不寫;
注入Spring表達式值;
在屬性或者setter方法前面使用@Value("#{const.PAGE_SIZE}");
@Value("Nihao")也可以注入基本類型的值;
注:以上是Spring知識的全面剖析,也是開發過程中常用的知識,面試也常被問到控制反轉等,喜歡的朋友可以收藏,歡迎大家踊躍評論!謝謝!