Spring-Bean相关配置

名称与标识

  • 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

  • Bean 的创建是单例的
/**
 * @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"/>

...
posted @ 2020-09-28 23:18  BNTang  阅读(71)  评论(0编辑  收藏  举报