bean的生命周期
bean.jpg
- Bean配置信息定義了Bean的實(shí)現(xiàn)及依賴關(guān)系专甩,Spring容器根據(jù)各種形式的Bean配置信息在容器內(nèi)部建立Bean定義注冊表,然后根據(jù)注冊表加載晚伙、實(shí)例化Bean颖低,并建立Bean和Bean的依賴關(guān)系,最后將這些準(zhǔn)備就緒的Bean放到Bean緩存池中陌宿,以供外層的應(yīng)用程序進(jìn)行調(diào)用锡足。
3個(gè)裝配方式
- 基于Java類的配置方式
- 基于XML的配置方式
- 基于注解的配置方式
1.基于Java類的配置方式
基于Java類定義Bean配置元數(shù)據(jù),其實(shí)就是通過Java類定義Spring配置元數(shù)據(jù)壳坪,且直接消除XML配置文件舶得。
1.1要點(diǎn):
- 必須要兩個(gè)注解:
- @Configuration :代替了xml配置.表明該類是一個(gè)配置類,該類應(yīng)該包含在Spring應(yīng)用上下文中如何創(chuàng)建bean的細(xì)節(jié)爽蝴。
- @Bean : 告訴Spring扩灯,這個(gè)方法將會(huì)返回一個(gè)對象。一般用在構(gòu)造器和Setter方法上
- 只需要這個(gè)兩個(gè)注解霜瘪,就可以完成bean的裝配過程了珠插。
- 非必須的注解:
- @import :用來引入別的類里面同樣有@Configuration標(biāo)簽的類。
- @importResource : 用來引入xml配置颖对,實(shí)現(xiàn)xml配置方式和java類配置方式共存捻撑。
1.2例子
- 代碼結(jié)構(gòu)
- Configuration 包:用來放Java類的配置。其實(shí)其作用就是跟xml配置一樣的缤底。所以此包下的類是Java類配置方式的核心
- Entity 包:用來放bean
- test 包: 測試
- 代碼
- Configuration 包下的EntityConfig類:
@Configuration //表示這個(gè)類可以使用 Spring IoC 容器作為 bean 定義的來源
public class EntityConfig {
@Bean
public UserBean user(){
return new UserBean( student()); //有參構(gòu)造
}
@Bean
public StudentBean student(){
return new StudentBean();
}
}
- Entity 包 UserBean類和StudentBean類:
public class UserBean {
private StudentBean studentBean;
public UserBean(){}
public UserBean(StudentBean studentBean){
this.studentBean=studentBean;
}
@Override
public String toString() {
return "this is UserBean";
}
public StudentBean getStudent(){
return studentBean;
}
}
public class StudentBean {
private String name;
private int age;
@Override
public String toString() {
return "this is StudentBean";
}
}
- test 包
@Test
public void test(){
ApplicationContext ctx=
new AnnotationConfigApplicationContext(EntityConfig.class); //應(yīng)用上下問
UserBean userBean=ctx.getBean(UserBean.class);
StudentBean student = userBean.getStudent(); //從userBean里顾患,看是否獲得studenBean
System.out.println(student.toString());
}
1.3基于Java類的配置主要使用場景:
對于實(shí)例化Bean的邏輯比較復(fù)雜,則比較適合用基于Java類配置的方式
2.基于XML配置
其實(shí)可從基于java類配置方式去考慮个唧,在Java類配置方式中江解,需要的兩個(gè)注解@Configuration 和@Bean 轉(zhuǎn)化成xml配置文件里說明。這樣的話java的配置類也可以不要了徙歼。
2.1要點(diǎn)
- xml配置犁河。有兩篇文章可以參考鳖枕。
- 基于xml配置的特點(diǎn)是自由度很高〗奥荩可以實(shí)現(xiàn)初始化bean宾符。還有c-命名空間等來裝配bean。裝配bean
2.2 例子
- Entity類:跟上面類一樣灭翔,不需要該魏烫。
- xml配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean id="studentBean" class="cn.Entity.StudentBean"/>
<bean id="userBean" class="cn.Entity.UserBean">
//在userBean類里面注入StudentBean 類,如果沒有這條會(huì)出現(xiàn)
NullPointerException異常
<property name="studentBean" ref="studentBean"/>
// name="" 是userBean 的屬性名稱肝箱。(需要setter方法)
// ref="" 是上面studentBean類注入的id哄褒。
</bean>
</beans>
- test類
@Test
public void testUserBean(){
ApplicationContext ctx=
new ClassPathXmlApplicationContext("spring.xml"); //配置文件的絕對路徑
if (ctx!=null){
UserBean user = (UserBean) ctx.getBean(UserBean.class);
System.out.println(user.getStudent());
}
}
- 使用場景:
- 第三方類庫,如DataSource煌张、JdbcTemplate等呐赡;
- 命名空間,如aop唱矛、context等罚舱;
3.自動(dòng)化裝配bean
可以對比前面兩種方法的變化,可以知道配置方法上的不同了绎谦。
- 相對于基于xml配置方法來說管闷,不需要在xml里面配置注入bean的信息,而換成注解注入窃肠。
- 而相對與基于java配置方法來說包个,不需要在配置類中創(chuàng)建對象的方法,只需要在需要注入的地方冤留,用注解就可以了
3.1要點(diǎn)
- 從兩個(gè)角度來實(shí)現(xiàn)自動(dòng)化裝配:
- 組件掃描:Spring會(huì)自動(dòng)發(fā)現(xiàn)應(yīng)用上下文中所創(chuàng)建的bean碧囊。(需要在xml里面配置,或者用注解)
- 自動(dòng)裝配:Spring自動(dòng)滿足bean之間的依賴纤怒。(需要用注解)
3.2例子
- 用@configuration來裝配bean
- 用到的注解
- @Configuration :代替了xml配置.表明該類是一個(gè)配置類糯而,該類應(yīng)該包含在Spring應(yīng)用上下文中如何創(chuàng)建bean的細(xì)節(jié)。
- @ComponentScan:啟動(dòng)組件掃描泊窘。(如果沒有設(shè)定范圍熄驼,默認(rèn)該包下)
- @Autowired :自動(dòng)注入。用在類下對象的注入
- @Compoent : 表明該類會(huì)作為組件類烘豹,并告知Spring要為該類建立bean瓜贾。
- @RunWith(SpringJUnit4ClassRunner,class):在測試開始的時(shí)候自動(dòng)創(chuàng)建Spring的應(yīng)用上下文
- @ContextConfiguration(class=xxxx) :加載配置,在這里是Config.class
- 用到的注解
很奇怪携悯,如果不用@ContextConfiguration(class=xxxx) 這個(gè)加載配置祭芦,是掃描不到我測試類下面的@Autowired 注解。也就是我用正規(guī)創(chuàng)建上下文方法創(chuàng)建的話憔鬼,test類下的對象是null的龟劲。 有待解決
- 代碼結(jié)構(gòu)
- Config類:用來裝配Spring規(guī)則胃夏。具有@Configuration和@ComponentScan注解
- StudentBean類和UserBean
- test類
- 例子
- Config類
@Configuration
@ComponentScan(basePackages = {"cn.Entity"})
public class Config { //不需像基于java配置一樣,用方法返回new 對象咸灿。
}
- SutdentBean和UserBean類
@Component
public class StudentBean {
private String name;
private int age;
@Override
public String toString() {
return "this is StudentBean";
}
}
***********************************************************************
@Component
public class UserBean {
private StudentBean studentBean;
public UserBean(){}
@Autowired
public UserBean(StudentBean studentBean){
this.studentBean=studentBean;
}
@Override
public String toString() {
return "this is UserBean";
}
public StudentBean getStudent(){
return studentBean;
}
public StudentBean getStudentBean() {
return studentBean;
}
}
- test類
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = Config.class)
public class UserBeanTest extends TestCase {
@Autowired
private UserBean userBean;
@Test
public void testUserBean(){
System.out.println(userBean.getStudent());
System.out.println(userBean);
}
}
- 用xml配置文件來裝配bean
只是把上面的Config類构订,用xml替換掉侮叮。其實(shí)只是用xml文檔寫一個(gè)掃描語句- spring.xml文檔
<?xml version="1.0" encoding="UTF-8"?> <beans //省去很多約束 <context:component-scan base-package="cn.Entity"/> </beans>
- StudentBean類和UserBean類沒變
- Test類
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration({"/spring.xml"}) //加載xml配置 public class UserBeanTest extends TestCase { @Autowired private UserBean userBean; @Test public void testUserBean(){ System.out.println(userBean.getStudent()); System.out.println(userBean); } }
- spring.xml文檔
- 使用場景:Bean的實(shí)現(xiàn)類是當(dāng)前項(xiàng)目開發(fā)的避矢,可直接在Java類中使用注解配置
4.總結(jié)
- 3個(gè)配置方式其實(shí)都很簡單,在開發(fā)過程中囊榜,都是推薦使用xml配置和自動(dòng)化裝配审胸。
- 不同配置方式比較
xml.png