名称与标识
- id:使用了约束中的唯一约束。值不能出现特殊字符
- name:没有使用约束中的唯一约束。值可以出现特殊字符
对象的生命周期
init-method
- Bean 被初始化的时候,才会执行
init-method
指定的方法
- 也就是说你指定了一个方法在对象初始化的时候就会调用你指定的这个方法
- 修改
applicationContext.xml
...
<bean id="userDao" class="top.it6666.service.impl.UserDaoMySQLImpl" init-method="save"/>
...
/**
* @author: BNTang
**/
public class UserDaoTest {
@Test
public void save() {
ApplicationContext applicationContext = new FileSystemXmlApplicationContext("F:/Develop/Spring/Spring-IOC/resources/applicationContext.xml");
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
}
}
destroy-method
/**
* @author: BNTang
**/
public class UserDaoTest {
@Test
public void save() {
ApplicationContext applicationContext = new FileSystemXmlApplicationContext("F:/Develop/Spring/Spring-IOC/resources/applicationContext.xml");
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
UserDao userDaoTwo = (UserDao) applicationContext.getBean("userDao");
System.out.println(userDao);
System.out.println(userDaoTwo);
}
}
top.it6666.service.impl.UserDaoMySQLImpl@1e6a3214
top.it6666.service.impl.UserDaoMySQLImpl@1e6a3214
- Bean 被销毁的时候,才会执行该
destroy-method
指定的方法
- 工厂关闭的时候对象才会销毁
- 也就是说你指定了一个方法在对象被销毁的时候,就会调用你指定的这个方法
- 修改
applicationContext.xml
...
<bean id="userDao" class="top.it6666.service.impl.UserDaoMySQLImpl" destroy-method="delete"/>
...
/**
* @author: BNTang
**/
public class UserDaoTest {
@Test
public void save() {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
// 接口当中是没有close的方法的,必须使用实现类
applicationContext.close();
}
}
Bean的作用范围
scope
- 可以通过
scope
属性进行设置使用的范围,也就是生效的范围
- singleton:默认的,Spring 会采用
单例
的模式创建对象
- prototype:Spring 会采用
多例
的模式创建对象
- request:应用在 web 项目中,Spring 创建这个类以后,会将这个对象存入到
request
范围中
- session:应用在 web 项目中,Spring 创建这个类以后,会将这个对象存入到
session
范围中
- globalsession
- 应用在 web 项目中,必须在
porlet
(基于 Java 的 Web 组件,子域名)环境下使用
- 但是如果没有这种环境,相对于
session
- 修改
applicationContext.xml
...
<bean id="userDao" class="top.it6666.service.impl.UserDaoMySQLImpl" scope="prototype"/>
...
/**
* @author: BNTang
**/
public class UserDaoTest {
@Test
public void save() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
UserDao userDaoTwo = (UserDao) applicationContext.getBean("userDao");
System.out.println(userDao);
System.out.println(userDaoTwo);
}
}
top.it6666.service.impl.UserDaoMySQLImpl@130c12b7
top.it6666.service.impl.UserDaoMySQLImpl@5e600dd5
工厂实例化的方式
无参构造
- 也就是 Spring 工厂内部创建 Bean(对象)的方式
默认
就是无参构造
- 修改
UserDaoMySQLImpl
显示的添加无参构造器并在当中添加一条语句:
/**
* @author: BNTang
**/
public class UserDaoMySQLImpl implements UserDao {
public UserDaoMySQLImpl() {
System.out.println("run default constructor method");
}
...
}
/**
* @author: BNTang
**/
public class UserDaoTest {
@Test
public void save() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDaoMySQLImpl) applicationContext.getBean("userDao");
}
}
run default constructor method
静态工厂实例化
- 修改
applicationContext.xml
...
<bean id="userDao" class="top.it6666.service.impl.UserDaoMySQLImpl" factory-method="createMySQL"/>
...
- 修改
UserDaoMySQLImpl
添加一个静态方法
- 这个方法的返回值是当前类的类型,需要自己手动创建返回
/**
* @author: BNTang
**/
public class UserDaoMySQLImpl implements UserDao {
public static UserDaoMySQLImpl createMySQL() {
System.out.println("run static method");
return new UserDaoMySQLImpl();
}
...
}
/**
* @author: BNTang
**/
public class UserDaoTest {
@Test
public void save() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDaoMySQLImpl) applicationContext.getBean("userDao");
}
}
run static method
实例工厂实例化
- 修改
applicationContext.xml
...
<bean id="userDao" class="top.it6666.service.impl.UserDaoMySQLImpl"/>
<bean id="userMySQL" class="top.it6666.service.impl.UserDaoMySQLImpl" factory-bean="userDao"/>
...