1 使用XML文件配置Spring程序
在XML文件中使用bean標簽,將其交給容器管理
- class: 指定bean對應的類型的全限定名稱
- id: 用于指定一個名稱,作為該bean的唯一標識符,如果不需要id,也可不指定該屬性
- name: 用于指定bean的別名,多個的使用空格或逗號或分號分割
- scope: 指定bean的范圍,決定了bean實例化的數量
scope有效值:
? ? ? ? singleton: 默認值,單例,每次請求一個bean,返回的是同一個共享實例
? ? ? ? prototype: 原型,每次請求一個bean,獲取的是一個新的實例
? ? ? ? 其他值包括:request, session, application, websocket等,是在web程序中使用
<bean id="dog" name="gou,quan" class="com.qdu.bean.Dog"scope="prototype" /><bean id="sheep" class="com.qdu.bean.Sheep" /><bean class="com.qdu.bean.Pig" />
- 對于單例的bean,容器啟動的時候就會實例化 ,如果將lazy-init設置為true,則單例的bean在第一次請求的時候被實例化。scope為prototype的bean在每次請求的時候被實例化
- init-method指定初始化時要調用的方法
- destroy-method指定bean被摧毀前要調用的方法
<bean id="singleDog" class="com.qdu.bean.SingleDog"lazy-init="true" init-method="init" destroy-method="destroy" />
在程序中獲取bean的方式有:
- 可以根據bean的id獲取bean的實例
- 可以根據bean的name獲取bean的實例
- 可以根據bean的類型獲取bean的實例
// 可以根據bean的id獲取bean的實例
Dog d1 = (Dog) ctx.getBean("dog");
d1.eat();// 也可根據bean的name(別名)獲取bean的實例
Dog d2 = (Dog) ctx.getBean("gou");
d2.eat();// 還可以根據bean的類型獲取bean實例
Dog d3 = ctx.getBean(Dog.class);
d3.eat();
2 使用Java代碼配置Spring程序
如果使用的是java配置類,而不是xml配置文件,則需要使用ApplicationContext接口的AnnotationConfigApplicationContext實現類來創建容器。
可以傳入一個或多個配置類的類型,這樣形成的容器管理這些配置類注冊的bean
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig1.class, SpringConfig2.class);
在com.qdu下創建一個config包來存儲Java配置類
相應注解:
- @Configuration說明類是一個java配置類
- @Bean表示方法返回的對象成為Spring管理的bean。默認一個bean是單例范圍,也就是不管請求該bean多少次,返回的是同一個共享實例。這種方式注冊的spring bean的名稱是方法名;可通過@Bean注解的name屬性指定bean的一個主名稱和多個別名,如果指定了名稱,則方法名就不作為bean的名稱了
- 可通過@Bean注解的initMethod指定初始化時要調用的方法,方法名稱隨便起,但是不能有參數
- 可通過@Bean注解的destroyMethod指定bean摧毀前要調用的方法,方法名稱隨便起,但是不能有參數
- @Scope注解用于指定bean的范圍,默認是singleton,還可以是prototype, request, session, application等
- @Lazy指示bean使用懶加載/延遲加載,默認單例的bean是容器啟動就實例化。如果使用該注解,則是第一次請求該bean的時候實例化。
SpringConfig1.class:
@Configuration
public class SpringConfig1 {@Bean(name= {"dog","gou","quan"})@Scope("prototype") public Dog dog() {return new Dog();}@Beanpublic Sheep sheep() {return new Sheep();}@Bean(initMethod="init",destroyMethod="destroy")@Lazy public SingleDog singleDog() {return new SingleDog();}
}
在程序中獲取bean的方式有:
- 可以根據bean的id獲取bean的實例
- 可以根據bean的name獲取bean的實例
- 可以根據bean的類型獲取bean的實例
Dog d1 = (Dog) ctx.getBean("dog");
d1.eat();Dog d2 = (Dog) ctx.getBean("gou");
d2.eat();Dog d3 = ctx.getBean(Dog.class);
d3.eat();
?3?使用注解配置Spring程序
若要使用注解配置,則需要在SpringConfig類中開啟包掃描:
@Configuration
@ComponentScan(basePackages= {"com.qdu.bean"})
public class SpringConfig {}
同2, 在這里我們使用的是java配置類,而不是xml配置文件,則需要使用ApplicationContext接口的AnnotationConfigApplicationContext實現類來創建容器。
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
?在Dog類中別忘記添加注解@Component!!!
@Component //將一個bean注冊為spring管理的bean,默認名稱是首字母小寫的類名
@Scope("prototype") //指定bean的范圍,默認是singleton
public class Dog {public Dog() {System.out.println("實例化了Dog!!!");}public void eat() {System.out.println("這是一只狗,狗吃骨頭!");}
}
除此之外,常用注解還有:
- @Lazy:延遲加載
- @PostConstruct:修飾的方法用于執行初始化工作
- @PreDestroy:修飾的方法在bean摧毀前調用,用于執行如釋放資源等操作
- 方法名可以隨便起,但是方法不能有參數!!!
在這里獲取bean的方式有兩種:
- 可以根據bean的id獲取bean的實例
- 可以根據bean的類型獲取bean的實例
// 可以根據bean的id獲取bean的實例
Dog d1 = (Dog) ctx.getBean("dog");
d1.eat();// 還可以根據bean的類型獲取bean實例
Dog d2 = ctx.getBean(Dog.class);
d2.eat();
?