容器:spring-Ioc容器与bean

1. spring 的beanFactory容器

bean.xml  HelloWorld实体类与spring教程学习笔记1相同

    public static void main(String[] args) {
        //XmlBeanFactory() API 去生成工厂 bean 以及利用 ClassPathResource() API 去加载在路径 CLASSPATH 下可用的 bean 配置文件。
        //XmlBeanFactory() API 负责创建并初始化所有的对象,即在配置文件中提到的 bean。
        @SuppressWarnings("deprecation")
        XmlBeanFactory factory=new XmlBeanFactory(new ClassPathResource("beans1.xml"));
        HelloWorld obj=(HelloWorld)factory.getBean("helloword");
        obj.getMessage();
    }

spring 的ApplicationContext容器

    public static void main(String[] args) {
        //该容器从 XML 文件中加载已被定义的 bean。在这里,你需要提供给构造器 XML 文件的完整路径
        ApplicationContext context=new FileSystemXmlApplicationContext("E:\\MyWorkspace\\HelloSpring\\src\\beans1.xml");
        HelloWorld obj=(HelloWorld)context.getBean("helloword");
        obj.getMessage();
    }
//不需要提供 XML 文件的完整路径,只需正确配置 CLASSPATH 环境变量即可 
ApplicationContext context=new ClassPathXmlApplicationContext("beans1.xml");

2.  spring bean的作用域

在xml文件中定义bean的时候,去定义bean的属性scope

scope=“Singleton”创建容器时就自动创建一个bean,每次获取bean时获取的是同一个bean对象

scope=“prototype”创建容器时并没有去实例化bean对象,而是在获取bean时实例化一个新对象。

3.  spring bean 生命周期

参数 init-method 指定一个方法在实例化bean的时候调用

参数 destroy-method 指定一个方法在销毁bean之后调用

beans.xml

 <bean id="helloword" class="com.tutorialspoint.HelloWorld" scope="singleton" init-method="inint" destroy-method="destroy">
 </bean>

HelloWord实体类

public class HelloWorld {
    private String message;
    public String getMessage() {
        System.out.println("your mesage is:"+message);
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
    //在bean初始化后会调用
    public void inint(){
        System.out.println("start bean");
    }
    //在bean被销毁后会调用
    public void destroy(){
        System.out.println("end bean");
    }
}

bean的加载,实例化,销毁

    public static void main(String[] args) {        
        @SuppressWarnings("deprecation")
        XmlBeanFactory context=new XmlBeanFactory(new ClassPathResource("beans1.xml"));
        HelloWorld obj=(HelloWorld)context.getBean("helloword");
        obj.setMessage("11111");
        obj.getMessage();
        context.destroySingleton("helloword");
    }

4. spring bean后置处理器

这里插入两个后置处理器

beans.xml

 <bean id="helloword" class="com.tutorialspoint.HelloWorld" scope="singleton" init-method="inint" destroy-method="destroy">
  </bean>
  <bean class="com.tutorialspoint.InitHelloworld"></bean>
  <bean class="com.tutorialspoint.InitHelloWorld1"></bean>

HelloWorld.java实体类与上面相同

InitHelloWorld.java  和InitHelloWorld1.java两个后置处理类

public class InitHelloworld implements BeanPostProcessor,Ordered{
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("0****BeforeInitialization: beanName is:"+beanName);
        return bean;
    }
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("0****AfterInitialization: beanName is:"+beanName);
        return bean;
    }
    @Override
    public int getOrder() {
        return 0;
    }    
}

加载,初始化,应用bean,销毁bean

        AbstractApplicationContext context=new ClassPathXmlApplicationContext("beans1.xml");
        HelloWorld obj=(HelloWorld)context.getBean("helloword");
        obj.setMessage("1111");
        obj.getMessage();
        context.registerShutdownHook();//销毁bean

对于InitHelloWorld1.java,只需要修改0为1即可,后置处理器的执行顺序会根据order的返回值来确定

最终结果:

0****BeforeInitialization: beanName is:helloword   后置处理器0 初始化前执行函数

1****BeforeInitialization: beanName is:helloword   后置处理器1 初始化前执行函数

start bean                                                                 bean在实例化后调用

0****AfterInitialization: beanName is:helloword      后置处理器0 初始化后执行函数

1****AfterInitialization: beanName is:helloword      后置处理器1 初始化后执行函数

your mesage is:1111                                                 bean的调用

end bean                                                                   bean在销毁后调用函数

5. spring bean 定义继承

beans.xml

    <bean id="hello" class="com.test.Hello">
        <property name="message1" value="hello111"></property>
        <property name="message2" value="hello222"></property>
    </bean>
    
    <bean id="hello2" class="com.test.Hello2" parent="hello">
        <property name="message1" value="hell02_111"></property>
        <property name="message3" value="hello3_333"></property>
    </bean>

Hello.java

public class Hello {
    private String message1;
    private String message2;

Hello2.java

public class Hello2 {
    private String message1;
    private String message2;
    private String message3;

运行下面代码后:

    public static void main(String[] args) {
        ApplicationContext context=new ClassPathXmlApplicationContext("beans.xml");
        Hello obj=(Hello)context.getBean("hello");
        obj.getMessage1();
        obj.getMessage2();
        
        Hello2 obj2=(Hello2)context.getBean("hello2");
        obj2.getMessage1();
        obj2.getMessage2();
        obj2.getMessage3();
    }

我们发现结果是,在obj2中我们并没有传message2的值,但它显示的是Hello中传的值。

spring bean定义的继承与java 类中定义的继承无关,不然的话,在java类的继承中,对于

子类来说,父类的private是不可见的,更不用说去继承它的值了。

参考文章:w3cschool学习教程

posted @ 2018-09-29 14:08  弱水三千12138  阅读(243)  评论(0编辑  收藏  举报