zoukankan      html  css  js  c++  java
  • Spring配置文件-Bean标签配置

    1.Bean标签基本配置

    用于配置对象交由Spring来创建

    默认情况下,它调用的是类中的无参构造函数,如果没有无参构造函数则不能创建成功。无参构造函数调用一次,代表对象创建一次。

    基本属性:

    id:Bean实例在Spring容器中的唯一标识

    class:Bean全限定名称

     

     2.Bean标签的范围配置

    scope:指对象的作用范围,取值如下:

     刚才的xml文件中其实是配置了scope,只不过是默认的singleton

     首先看配置成singleton

    package com.company.com;
    
    import com.company.dao.UserDao;
    
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class SpringTest {
        @Test
        //测试scope属性
        public void test1() {
            ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
            UserDao userDao1 = (UserDao) applicationContext.getBean("userDao");
            UserDao userDao2 = (UserDao) applicationContext.getBean("userDao");
            System.out.println(userDao1);
            System.out.println(userDao2);
        }
    }
    

      要看对象是否是同一个,只要看他们的地址就行了

    当scope取值为singleton时:

    Bean实例化个数:1个

    Bean实例化时机当Spring核心文件被加载时,实例化配置的Bean实例

    Bean的生命周期:

    • 对象创建:当应用加载,创建容器时,对象就被创建
    • 对象运行:只要容器在,对象一直活着
    • 对象销毁:当应用卸载,销毁容器时,对象就被销毁了

     配置成prototype时

     可以看到两个对象的地址不一样,说明不是同一个对象,每次都是new出来一个新的。容器中存在UserDaoImpl对象不止一个。

     当scope取值为prototype时

    Bean的实例化个数:多个

    Bean的实例化时机:当调用getBean()方法时实例化Bean

    Bean的生命周期:

    • 对象创建:当使用对象时,创建新的对象实例
    • 对象运行:只要对象在使用中,对象一直活着
    • 对象销毁:当对象长时间不用时,就会被java垃圾回收器回收

     

    package com.company.com;
    
    import com.company.dao.UserDao;
    
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class SpringTest {
        @Test
        //测试scope属性
        public void test1() {
            ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
            UserDao userDao1 = (UserDao) applicationContext.getBean("userDao");
            System.out.println(userDao1);
        }
    }

    3.Bean生命周期配置

    init-method:指定类中的初始化方法名称

    destroy-method:指定类中销毁方法名称

    这个对象如果创建完毕,我想让它执行初始化的工作,我可以调用init方法;如果这个对象销毁之前,我想让它执行一些销毁的动作,我可以调用destroy

    通过配置的方式,告诉Spring,我这个Bean有初始化方法,有销毁方法,一会儿要帮我执行下。

    package com.company.dao.impl;
    
    import com.company.dao.UserDao;
    
    public class UserDaoImpl implements UserDao {
        public UserDaoImpl() {
            System.out.println("UserDaoImpl创建...");
        }
    
        public void init() {
            System.out.println("初始化方法....");
        }
    
        public void destroy() {
            System.out.println("销毁方法....");
        }
    
        public void save() {
            System.out.println("save running...");
        }
    }

    为什么没有打印销毁的那个方法呢?

    因为还没有来得及打印,就销毁了。

    下面我把容器手动关闭,手动关闭时,容器意识到自己要挂了,在挂之前,把内部的某些对象的销毁方法执行一下。

    package com.company.com;
    
    import com.company.dao.UserDao;
    
    import org.junit.Test;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class SpringTest {
        @Test
        //测试scope属性
        public void test1() {
            ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
            UserDao userDao1 = (UserDao) applicationContext.getBean("userDao");
            System.out.println(userDao1);
            applicationContext.close();
        }
    }

     4.Bean实例化的三种方式

    都是在配置文件中修改,applicationContext.xml

    (1)无参构造方法实例化

    (2)工厂静态方法实例化

    package com.company.factory;
    
    import com.company.dao.UserDao;
    import com.company.dao.impl.UserDaoImpl;
    
    public class StaticFactory {
        public static UserDao getUserDao() {
            return new UserDaoImpl();
        }
    }

    Spring在解析的时候,发现你这个applicationContext.xml中,有一个factory-method,就找这个全包名com.company.factory.StaticFactory对应的内部指定的方法去返回对应的对象。

    因为是静态的,所以可以直接调用这个factory-method,即getUserDao

    (3)工厂实例方法实例化

     方法不是静态的了,因此必须先有工厂对象,再去调用方法getUserDao

    所以,先把工厂对象让Spring产生(通过无参构造的方式),再去调用工厂的某个方法

  • 相关阅读:
    Unique Binary Search Trees 解答
    Unique Paths II 解答
    Unique Paths 解答
    Maximum Subarray 解答
    Climbing Stairs 解答
    House Robber II 解答
    House Robber 解答
    Valid Palindrome 解答
    Container With Most Water 解答
    Remove Duplicates from Sorted List II 解答
  • 原文地址:https://www.cnblogs.com/GumpYan/p/14103691.html
Copyright © 2011-2022 走看看