Bean的相关配置

66 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

名称与标识

Id:使用了约束中的唯一约束,里面不能出现特殊字符(开发中较多使用)

Name:没有使用约束中的唯一约束,也可以出现特殊字符

设置对象生命周期方法

Init-method:Bean被初始化的时候执行的方法

Destory-method:Bean被销毁的时候执行的方法,由于Bean默认是单例模式创建的,所以会在工厂关闭的时候调用销毁方法

1. 在UserDaoOrcleImpl中编写init方法和destory方法

public class UserDaoOrcleImpl implements UserDao {
    @Override
    public void save() {
        System.out.println("orcle-save");
    }

    @Override
    public void delete() {
        System.out.println("orcle-delete");
    }

    public void initMethod() {
        System.out.println("执行初始化方法");
    }

    public void destoryMethod() {
        System.out.println("执行销毁方法");
    }
}

2. 编写applicationContext.xml配置文件,将init方法和destory方法配置到bean中

<?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="com.ph.demo1.UserDaoOrcleImpl"
      init-method="initMethod"  destroy-method="destoryMethod"/>
</beans>

3. 编写测试类

public class test {
 public static void main(String[] args){
     // 1、加载配置文件,调用Bean的初始化方法
     ApplicationContext applicationContext= new ClassPathXmlApplicationContext("applicationContext.xml");
     // 2、 参数为配置文件中bean的id
     UserDao userDao = (UserDao)applicationContext.getBean("userDao");
     //3、调用UserDaoMysqlImpl类中的save方法
     userDao.save();
     //4、关闭工厂,调用销毁方法
     ((ClassPathXmlApplicationContext)applicationContext).close();
 }
}

4. 运行结果

图片1.png

Bean作用范围配置

Singleton:默认值,Spring默认采用单例模式创建对象  

Prototype:多例模式

Request:应用在web项目中,Spring创建这个类以后,将这个对象存入到request范围中

Session:应用在web项目中,Spring创建这个类以后,将这个对象存入到session范围中

Globalsession:应用在web项目中,必须在porlet(基于java的web组件,子域名)环境下使用。

1、配置Bean

<?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:为类的全路径
    init-method:对象创建时调用的初始化方法
    destory-method:对象销毁时调用的销毁方法
    scope:bean的作用范围,默认为singleton
     -->
<bean id="userDao" class="com.ph.demo1.UserDaoOrcleImpl"
      init-method="initMethod"  destroy-method="destoryMethod"
      scope="singleton"/>

2、测试

public class test {
 public static void main(String[] args){
     ApplicationContext applicationContext= new ClassPathXmlApplicationContext("applicationContext.xml");
     UserDao userDao = (UserDao)applicationContext.getBean("userDao");
     System.out.println(userDao);
     UserDao userDao1 = (UserDao)applicationContext.getBean("userDao");
     System.out.println(userDao1);
 }
}

3. 运行结果

将对象地址打印出来对比

scope="singleton"

图片2.png

scope="prototype"

图片3.png

从运行结果可以看出,在单例模式下,只会创建一个bean对象,因此只会调用一次初始化方法。而在多例模式下,每次getbean时都会重新创建对象,每创建一次对象都会调用一次初始化方法

工厂实例化的方式

public class test {
 public static void main(String[] args){
     ApplicationContext applicationContext= new ClassPathXmlApplicationContext("applicationContext.xml");
     UserDao userDao = (UserDao)applicationContext.getBean("userDao");
 }
}

1. 无参构造方法(默认)

<?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:为类的全路径
    init-method:对象创建时调用的初始化方法
    destory-method:对象销毁时调用的销毁方法
    scope:bean的作用范围,默认为singleton
     -->
<bean id="userDao" class="com.ph.demo1.UserDaoOrcleImpl"
      init-method="initMethod"  destroy-method="destoryMethod"
      scope="prototype" />
</beans>

public class UserDaoOrcleImpl implements UserDao {
    public UserDaoOrcleImpl(){
        System.out.println("执行无参构造方法");
    }
      @Override
    public void save() {
        System.out.println("orcle-save");
    }

    @Override
    public void delete() {
        System.out.println("orcle-delete");
    }

    public void initMethod() {
        System.out.println("执行初始化方法");
    }

    public void destoryMethod() {
        System.out.println("执行销毁方法");
    }
}

图片4.png

从以上结果可以得知,创建对象时首先调用自己的无参构造方法,然后才调用init-method里的方法

2. 静态工厂实例化

<?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:为类的全路径
    init-method:对象创建时调用的初始化方法
    destory-method:对象销毁时调用的销毁方法
    scope:bean的作用范围,默认为singleton
     -->
<bean id="userDao" class="com.ph.demo1.UserDaoOrcleImpl"
      init-method="initMethod"  destroy-method="destoryMethod"
      scope="prototype" factory-method="create"/>
</beans>

public class UserDaoOrcleImpl implements UserDao {
    public UserDaoOrcleImpl(){
        System.out.println("执行无参构造方法");
    }
    public static UserDaoOrcleImpl create(){
        System.out.println("执行了create方法");
        return new UserDaoOrcleImpl();
    }
    @Override
    public void save() {
        System.out.println("orcle-save");
    }

    @Override
    public void delete() {
        System.out.println("orcle-delete");
    }

    public void initMethod() {
        System.out.println("执行初始化方法");
    }

    public void destoryMethod() {
        System.out.println("执行销毁方法");
    }
}

图片5.png

从以上结果可以得知,创建对象时首先会调用factory-method里静态方法,然后才会调用自己的无参构造方法,最后才会调用init-method里的方法

3. 实例工厂实例化

public class userDaoFactory {
    public userDaoFactory(){
        System.out.println("执行工厂的构造方法");
    }
}

<?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:为类的全路径
    init-method:对象创建时调用的初始化方法
    destory-method:对象销毁时调用的销毁方法
    scope:bean的作用范围,默认为singleton
     -->
    <bean id="userDaoBean" class="com.ph.demo1.userDaoFactory"/>
    <bean id="userDao" class="com.ph.demo1.UserDaoOrcleImpl"
          init-method="initMethod" destroy-method="destoryMethod"
          scope="prototype" factory-bean="userDaoBean"/>
</beans>

图片6.png

从以上结果可以得知,创建对象时首先会调用factory-bean里bean的无参构造方法,然后才会调用自己的无参构造方法,最后才会调用init-method里的方法