美文网首页
四:spring容器

四:spring容器

作者: 逗儿比的日常 | 来源:发表于2024-05-30 10:58 被阅读0次

    概念

    Spring容器里装的是需要管理的对象,装在一个HashMap集合中。我们用容器来实例化对象,管理对象之间的依赖
    只要实现了BeanFactory和ApplicationContext接口的类,那么这两个接口的类都可以作为Spring容器

    BeanFactory

    是最顶层最基本的接口,它描述了容器需要实现的最基本的功能

    ApplicationContext

    继承了BeanFactory接口,它描述的内容更加广泛。它是把beans.xml文件里的内容先存放到HashMap容器里,需要用的时候从里面取,用得最多

    实例化Bean的三种方式

    在 Spring 中,构成应用程序主干并由 Spring IoC 容器管理的对象称为 bean。bean 是由Spring IoC 容器实例化、组装和管理的对象

    1)使用默认无参构造函数

    在默认情况下,它会根据默认无参构造函数来创建类对象,如果bean中没有默认无参构造函数,将会创建失败

    beans.xml文件中            
    <bean id="accountDao" class="xn.xh.dao.impl.AccountDaoImpl"/>           
                
    AccountDaoImpl.java文件中          
    public class AccountDaoImpl implements IAccountDao {            
        //无参构造函数。如果一个类没有定义任何的构造函数,那么会自动生成一个无参构造函数       
        public AccountDaoImpl() {       
            System.out.println("创建了对象!");   
        }   
    
       ===========================================================
        //如果上面这个代码改成下面这样,执行client时就会报错
        public AccountDaoImpl(String name) {    
        System.out.println("创建了对象!");
        }   
       ===========================================================
        
        @Override       
        public void saveAccount() {     
            System.out.println("jdbc保存账户!");    
        }       
    }           
                
                
    client.java文件中          
    public class client {           
        public static void main(String[] args) {        
            ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");   
            IAccountDao accountDao = (IAccountDao)context.getBean("accountDao");    
            accountDao.saveAccount();   
            //运行结果为在控制台打印出:创建了对象! Jdbc保存账户! 
        }       
    }           
    
    
    2)spring管理静态工厂,使用静态工厂的方法创建对象

    模拟一个静态工厂,创建数据层实现类

    beans.xml文件中                    
    <bean id="accountDao" class="xn.xh.factory.StaticFactory" factory-method="createAccountDao" />                  
                        
    AccountDaoImpl.java文件中                  
    public class AccountDaoImpl implements IAccountDao {                    
        public AccountDaoImpl() {               
            System.out.println("创建了对象!");           
        }               
        @Override               
        public void saveAccount() {             
            System.out.println("jdbc保存账户!");            
        }               
    }                   
                        
                        
    StaticFactory文件中                    
    public class StaticFactory {                    
        public static IAccountDao createAccountDao() {              
            return new AccountDaoImpl();            
        }               
    }                   
                        
    client.java文件中                  
    public class client {                   
        public static void main(String[] args) {                
            ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");           
            IAccountDao accountDao = (IAccountDao)context.getBean("accountDao");            
            accountDao.saveAccount();           
            //运行结果为在控制台打印出:创建了对象! Jdbc保存账户!         
        }               
    }                   
    
    
    执行过程解析

    此种方法是
    使用StaticFactory类中的静态方法createAccountDao创建对象,并存入spring容器
    id属性:指定bean的id,用于从容器中获取
    class属性:指定静态工厂的全限定类名
    factory-method属性:指定生产对象的静态方法

    3)spring管理实例工厂-使用实例工厂的方法创建对象

    模拟一个实例工厂,创建业务层实现类
    次工厂创建对象,必须有工厂实例对象,再调用方法

    beans.xml文件中                                            
    <bean id="InstanceFactory" class="xn.xh.factory.InstanceFactory" />                                         
    <bean id="accountDao" factory-bean="InstanceFactory" factory-method="createAccountDao" />                                           
                                                
    AccountDaoImpl.java文件中                                          
    public class AccountDaoImpl implements IAccountDao {                                            
        public AccountDaoImpl() {                                       
            System.out.println("创建了对象!");                                   
        }                                       
        @Override                                       
        public void saveAccount() {                                     
            System.out.println("jdbc保存账户!");                                    
        }                                       
    }                                           
                                                
    InstanceFactory.java文件中                                         
    public class InstanceFactory {                                          
        public IAccountDao createAccountDao() {                                     
            return new AccountDaoImpl();                                    
        }                                       
    }                                           
                                                
    client.java文件中                                          
    public class client {                                           
        public static void main(String[] args) {                                        
            ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");                                   
            IAccountDao accountDao = (IAccountDao)context.getBean("accountDao");                                    
            accountDao.saveAccount();                                   
            //运行结果为在控制台打印出:创建了对象! Jdbc保存账户!                                 
        }                                       
    }                                           
    
    
    执行过程解析

    2)和3)那么麻烦,为什么不只用1)的方法进行创建实例对象呢? 比如上面工厂(InstanceFactory类)是第三方的jar包,我们无法修改里面的代码,但又想通过它来生成实例对象时就要用到了

    bean标签

    作用

    用于配置对象让spring来创建的

    属性

    id:给对象在容器中提供一个唯一标识,用于获取对象
    class:指定类的全限定类名,用于反射创建对象
    scope:指定对象的作用范围
    ・singleton:默认值,单例的
    ・prototype:多例的
    ・request:web项目中Spring创建一个Bean的对象,将对象存入到request域中
    ・session:web项目中Spring创建一个Bean的对象,将对象存入到session域中

    bean的作用范围和生命周期
    单例对象

    scope=“singleton”
    一个应用只有一个对象的实例,它的作用范围就是整个引用
    在加载beans.xml文件的时候创建对象,放入到HashMap集合当中,只会被创建一次。用getBean()方法调用的时候直接去集合里取
    生命周期
    ・对象出生:当应用加载,创建容器时,对象就被创建了
    ・对象活着:只要容器在,对象一直活着
    ・对象死亡:当应用卸载,销毁容器时,对象就会被销毁

    多例对象

    scope="prototype"
    每次访问对象时,都会重新创建对象实例
    生命周期
    ・对象出生:当使用对象时,创建新的对象实例
    ・对象活着:只要对象在使用中,就一直活着
    ・对象死亡:当对象长时间不用时,被java的垃圾回收器回收了

    相关文章

      网友评论

          本文标题:四:spring容器

          本文链接:https://www.haomeiwen.com/subject/dxggfjtx.html