spring 随笔(体系结构和生命周期)

spring体系结构

这里写图片描述

主要api

BeanFactoy 一个工厂,用于生成任意Bean,负责读取bean配置文档,管理bean的加载,实例化,维护bean之间的依赖关系,负责bean的声明周期。特点是延迟加载,只有在第一次getBean时才会初始化Bean
ApplicatinContext:是他的子接口,功能更加强大,当配置文件被加载,Bean就被初始化。
提供了国际化处理
资源访问:Resource rs = ctx.getResource(”classpath:config.properties”)
“file:c:/config.properties”
事件传递:通过实现ApplicationContextAware接口
Bean自动装配
各层Context实现:WebApplicationContextUtils
ClassPathXmlApplicationContext 加载classpath下的配置文件
FileSystemXmlApplicationContext 用于加载指定盘符下的xml

Bean的种类

1.普通Bean: < bean id=”” class=”A”> ,spring直接创建A实例,并返回
2.FactoryBean:是一个特殊的bean,具有工厂生成对象能力,只能生成特定的对象。bean必须使用 FactoryBean接口,此接口提供方法 getObject() 用于获得特定bean。< bean id=”” class=”FB”> 先创建FB实例,使用调用getObject()方法,并返回方法的返回值,FB fb = new FB();return fb.getObject();例如:ProxyFactoryBean是生成代理Bean的。

作用域

这里写图片描述

生命周期

初始化和销毁的方法是在目标方法执行前后执行的
1 . 在xml中定义Bean
2 . 在xml中配置初始化和销毁

package com.spring.lifecycle;

public class BookServiceImpl implements BookService {

    @Override
    public void insert() {
        System.out.println("调用dao");
    }
    public void init(){
        System.out.println("初始化");

    }
    public void destroy(){
        System.out.println("销毁");
    }

}
 <!-- init-method 初始化方法名称       destory-mothod 销毁方法名称 -->
    <bean id="BookService" class="com.spring.lifecycle.BookServiceImpl"
        init-method="init" destroy-method="destroy"></bean>

3 . 调用bean

package com.spring.lifecycle;

import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestApi {
    @Test
    public void fun(){
        String xmlPath="com/spring/lifecycle/applicationContext.xml";
        ClassPathXmlApplicationContext context= new ClassPathXmlApplicationContext(xmlPath);
        BookService service = context.getBean("BookService",BookService.class);
        service.insert();
        context.close();


    }


}

4 .Bean的销毁
注意的是:销毁Bean必须是单例的,并且一定要关闭容器。

BeanPostProcessor

spring 提供一种机制,只要实现此接口BeanPostProcessor,并将实现类提供给spring容器,spring容器将自动执行,在初始化方法前执行before(),在初始化方法后执行after() 生成代理类,AOP的底层实现。
执行的流程:
这里写图片描述
问题:如果我们要使用jdk动态代理来实现 对目标方法的增强,是应该在before() 还是After()中返回代理对象那?我们的初始化和销毁的方法都是在接口的实现类中定义的。而我们的接口中只有目标方法,假如我们要在before()中实现代理。那么在执行初始化方法的时候用的就是代理对象,而代理对象没有这个方法导致无法初始化。所以要在接口中也实现初始化和销毁的方法。或者在After()方法中返回代理对象。这也正好说明了JDK动态代理没有摆脱接口的限制,所有就有了cglib代理。

package com.spring.lifecycle;

public interface BookService {

    void insert();

}
package com.spring.lifecycle;

public class BookServiceImpl implements BookService {

    @Override
    public void insert() {
        System.out.println("调用dao");
    }
    public void init(){
        System.out.println("初始化");

    }
    public void destroy(){
        System.out.println("销毁");
    }

}
package com.spring.lifecycle;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

public class MyBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("before");
        System.out.println(beanName);
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("after");
        System.out.println(beanName);

        return new ProxyService().bind(bean);
    }

}
package com.spring.lifecycle;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyService implements InvocationHandler {
    private Object target;// 真实对象

    public Object bind(Object obj) {
        this.target = obj;
        return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);

    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("开启事务");
        Object object = method.invoke(this.target, args);
        System.out.println("关闭事务");
        return object;
    }

}
<?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">
    <!-- init-method 初始化方法名称       destory-mothod 销毁方法名称 -->
    <bean id="BookService" class="com.spring.lifecycle.BookServiceImpl"
        init-method="init" destroy-method="destroy"></bean>
    <!-- 绑定bean -->
    <bean class="com.spring.lifecycle.MyBeanPostProcessor"></bean>

</beans>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章