Spring的bean配置详解
1.创建java工程
2.暂时引入如下包(一般情况下IDEA会把基本的一些jar会给你下载好)
3.创建Spring的配置文件
默认src下名称叫:ApplicationContext.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.xsd">
<bean id="#" class="#">
<!-- collaborators and configuration for this bean go here -->
</bean>
</beans>
4.创建bean初始化ApplicationContext.xml文件
- 我们必须指定id,它是唯一标识,class就是bean的类的全路径
<bean id="UserDao" class="dao.impl.UserDaoImpl"></bean>
2.创建Spring的容器
// 初始化spring容器
ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");
// 获得bean
UserDao userDao = (UserDao) context.getBean("这是就是你bean里面配置的id");
3.多个ApplicationContext.xml文件的容器创建
第一种方式:
public class TestSpring {
@Test
public void test() {
// 初始化spring容器
ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"ApplicationContext.xml", "ApplicationContext2.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.xsd">
<bean id="UserDao" class="dao.impl.UserDaoImpl"></bean>
<!--直接进行引入-->
<import resource="ApplicationContext2.xml"/>
</beans>
5.Bean的创建方式
- 使用构造器创建
要求:使用构造器方式创建bean,要求bean必须要求有默认的构造器,这是工作中最常用的方式
package model;
public class User {
private Integer userId;
private String Username;
public User() {
System.out.println("user被创建");
}
public User(Integer userId, String username) {
this.userId = userId;
Username = username;
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUsername() {
return Username;
}
public void setUsername(String username) {
Username = username;
}
}
<?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.xsd">
<bean id="user" class="model.User"></bean>
</beans>
public class TestSpring {
@Test
public void test() {
// 初始化spring容器
ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");
// 获得bean
User user = (User) context.getBean("user");
}
}
- 静态工厂方式创建
提供静态工厂:
public class FactoryBean {
/**
* 必须是静态方法
* @return
*/
public static User createUser() {
return new User();
}
}
配置:
<?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.xsd">
<!--
id:唯一标识
class:静态工厂的类
factory-method:静态工厂的方法
-->
<bean id="user" class="factory.FactoryBean" factory-method="createUser"></bean>
</beans>
- 实例工厂方式创建
实例工厂:
public class FactoryBean1 {
public User createUser() {
return new User();
}
}
配置:
<?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.xsd">
<!--
通过Spring来定义实例工厂
-->
<bean id="fectoryBean" class="factory.FactoryBean1"></bean>
<!--指定要创建的bean
factory-bean:指定实例工厂类
factory-method:工厂的创建bean的方法
-->
<bean id="user" factory-bean="fectoryBean" factory-method="createUser"></bean>
</beans>
测试:
public class TestSpring {
@Test
public void test() {
// 初始化spring容器
ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");
// 获得bean
User user = (User) context.getBean("user");
System.out.println(user);
}
}
6.延迟加载(bean的生命周期)
所有的bean默认情况下,非延迟加载的,是spring的容器创建的时候就把bean给创建出来了,我们getBean的时候直接从容器中去拿这个Bean就ok了。
是否延迟加载由lazy-init来控制,默认是false,如果变成true,就在getBean的时候去创建user。
<?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.xsd"
default-lazy-init="true"
>
<!--单个去做延迟加载配置-->
<!-- <bean id="user" class="model.User" lazy-init="true"></bean>-->
</beans>
7.bean的作用域
默认情况下,bean都是单例的,是容器初始化的时候被创建的,就这么一份。
Scope:singleton(单例),prototype(多例),默认不配置时是singleton
如果是singleton我们可以设置非延迟加载(容器初始化时创建bean)和延迟加载方式创建bean(getBean的时候才创建)
<bean id="user" class="model.User" scope="singleton" lazy-init="true"></bean>
如果是prototype我们没得选择,只能是延迟加载方式创建(getBean的时候才创建)
<bean id="user" class="model.User" scope="prototype"></bean>
8.bean的生命周期
通过两个方法来验证
init方式和destroy方法
init在bean被创建的时候被调用,主要是做一些准备工作。
destory是被bean被销毁的时候被调用,做清理工作。
bean的生命周期和容器一致,容器被创建bean就被创建,容器销毁bean就被销毁。
在User中定义两个方法:
package model;
public class User {
private Integer userId;
private String Username;
public User() {
System.out.println("user被创建");
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUsername() {
return Username;
}
public void setUsername(String username) {
Username = username;
}
public void init() {
System.out.println("我出来了");
}
public void destroy() {
System.out.println("二十年后又是一条好汉");
}
}
配置:
<!--
init-method:被创建时调用
destroy-method:被销毁时调用
-->
<bean id="user" class="model.User" init-method="init" destroy-method="destroy"></bean>