zoukankan      html  css  js  c++  java
  • Spring IOC

    a.通过类的无参构造方法创建对象

    在入门案例中就是这种方式。当用最普通的方式配饰一个<bean>时,默认就是采用类的

    无参构造创建对象。在Spring容器初始化时,通过<bean>上配置的class属性反射的到字

    节码对象,通过newInstance()创建对象。

        Class c = Class .forName("类的全路径名称")
        Object obj = c.newInstance()

    这种方式下Spring创建对象,必须有无参的构造,否则无法通过反射创建对象,会抛出异常。

    package cn.tedu.beans;
    
    public class Person {
        public Person(String str) {
    
            System.out.println("有参构造 ~~~");
        }
        
        public void say() {
            System.out.println("person hello spring ~~~");
        }
    }
        @Test
        /**
         * SpringIOC 创建对象方式 1 - 通过无参构造方法创建对象
         */
    
        public void  test4(){
            /*
             <bean id="person" class="cn.tedu.beans.Person"></bean>
             <alias name="person" alias="per"/>
            */
            
            ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
            // 通过id获取
            Person p = (Person) context.getBean("person");
            p.say();
    
        }

    b.通过静态工厂创建对象

    很多时候,我们面对的类是无法通过无参构造去创建的,例如该类没有无参构造、是一抽象类等等情况,此时无法要求spring通过无参构造创建对象,此时可以使用静态工厂方式创建对象。

    package cn.tedu.factory;
    
    import java.util.Calendar;
    
    public class CalendarStaticFactory {
        public static Calendar getInstance(){
            return Calendar.getInstance();
        }
    }
    <?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-3.2.xsd"
        >
        
        <bean id="calendar" class="cn.tedu.factory.CalendarStaticFactory" factory-method="getCalendar"></bean>
        
    </beans>
        @Test
        /**
         * SpringIOC 创建对象方式 2 - 静态工厂
         */
        public void  test5(){
            
            ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
            // 通过id获取
            Calendar calendar = (Calendar) context.getBean("calendar");
            System.out.println(calendar);
        }

    c.实例工厂创建对象

    实例工厂也可以解决类是无法通过无参构造创建的问题,解决的思路和静态工厂类似,只不过实例工厂提供的方法不是静态的。Spring需要先创建出实例工厂的对象,在调用实例工厂对象上指定的普通方法来创建对象。所以实例工厂也需要配置到Spring中管理。

    package cn.tedu.factory;
    
    import java.util.Calendar;
    
    public class CalendarFactory {
        public Calendar getCalendar(){
            return Calendar.getInstance();
        }
    }
    <?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-3.2.xsd"
        >
        
        <bean id="calendarFactory" class="cn.tedu.factory.CalendarFactory"></bean>
        <bean id="calendar" factory-bean="calendarFactory" factory-method="getCalendar"></bean>
        
    </beans>
        @Test
        /**
         * Spring 创建对象方式3 - 实例工厂
         */
        public void test7(){
            ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
            Calendar calendar = (Calendar) context.getBean("calendar");
            System.out.println(calendar);
        }

    d.Spring工厂创建对象

    Spring内置了工厂接口,也可以通过实现这个接口来开发Spring工厂,通过这个工厂创建对象。

    package cn.tedu.factory;
    
    import java.util.Calendar;
    
    import org.springframework.beans.factory.FactoryBean;
    
    public class CalendarSpringFactory implements FactoryBean<Calendar> {
    
        /**
         * Spring工厂生产对象的方法
         */
        @Override
        public Calendar getObject() throws Exception {
            return Calendar.getInstance();
        }
    
        /**
         * 获取当前工厂生产的对象的类型的方法
         */
        @Override
        public Class<?> getObjectType() {
            return Calendar.class;
        }
    
        /**
         * Spring工厂生产对象时是否采用单例模式
         * 如果返回true,则在spring中该对象只创建一次,后续重复使用
         * 如果返回false,则每次获取该bean都重新创建对象
         */
        @Override
        public boolean isSingleton() {
            return true;
        }
    }
    <?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-3.2.xsd"
        >
        
        <bean id="calendar" class="cn.tedu.factory.CalendarSpringFactory"></bean>
        
    </beans>
        @Test
        /**
         * SpringIOC 创建对象方式 3 - spring工厂
         */
        public void  test6(){
            
            ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
            // 通过id获取
            Calendar calendar = (Calendar) context.getBean("calendar");
            System.out.println(calendar);
        }
  • 相关阅读:
    java程序员面试笔记宝典 note
    JVM常见面试题
    面试&笔试总结 数据库、网络协议、常识
    面试&笔试总结 Java框架篇
    面试准备&总结-Java基础篇
    JDBC事务管理及SavePoint示例
    JSP的内置对象
    Java中的集合框架
    .NET WEBAPI 添加中英文切换,国际化项目
    搜索引擎入门 (建立一个简单的java Lucene实例)
  • 原文地址:https://www.cnblogs.com/chuijingjing/p/9782910.html
Copyright © 2011-2022 走看看