IOC整理


是SpringIOC,就是把一个bean()与bean()之系交第三方容器行管理。

 

关键类

 

BeanFactory

IOC的顶层容器,描述了IOC的规范

BeanFactory是一个接口,是Spring中工厂的顶层规范,IOC的核心接口。

了getBean()、containsBean()等管理Bean的通用方法。

有getbean,才例化

 

public interface BeanFactory {

 

//FactoryBean的转义,因如果使用bean的名字索FactoryBean得到的象是工厂生成的象,

//如果需要得到工厂本身,需要转义

String FACTORY_BEAN_PREFIX = "&";

 

//根bean的名字,取在IOC容器中得到bean

Object getBean(String name) throws BeansException;

 

//根bean的名字和Class型来得到bean例,加了型安全验证机制。

T getBean(String name, @Nullable Class requiredType) throws BeansException;

 

Object getBean(String name, Object... args) throws BeansException;

 

T getBean(Class requiredType) throws BeansException;

 

T getBean(Class requiredType, Object... args) throws BeansException;

 

//提供bean的索,看看是否在IOC容器有个名字的bean

boolean containsBean(String name);

 

//根bean名字得到bean例,并同判断个bean是不是

boolean isSingleton(String name) throws NoSuchBeanDefinitionException;

 

boolean isPrototype(String name) throws NoSuchBeanDefinitionException;

 

boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;

 

boolean isTypeMatch(String name, @Nullable Class<?> typeToMatch) throws NoSuchBeanDefinitionException;

 

//得到bean例的Class

@Nullable

Class<?> getType(String name) throws NoSuchBeanDefinitionException;

 

//得到bean的名,如果根索,那其原名也会被索出来

String[] getAliases(String name);

}

 

 

 

 

载过

Xml→Resource→BeanDefinition→BeanFactroy

 

Resoucrce

org.springframework.core.io.Resource,对资源的抽象。一个实现类都代表了一种资源的访问策略,如 ClassPathResource、URLResource、FileSystemResource 等。

 

ResourceLoader

有了源,就应该源加,Spring 利用 org.springframework.core.io.ResourceLoader 来源加

 

BeanDefinition

ioc 实现中 我在xml 中描述的Bean信息最后 都将保存至BeanDefinition (定象中

// BEAN描述信息

public class BeanDefinition {

    // 名称

    private String name;

    // CLASS

    private Class<?> clazz;

    // 通名称和CLASS例化, 使用CLASS名作BEAN的名称

    public BeanDefinition(String name, Class<?> clazz) {

        this.clazz = clazz;

        this.name = BeanUtil.isEmpty(name) ? BeanUtil.getName(clazz) : name;

    }

    // Getter & Setter

    // ...

}

 

BeanDefinitionReader

作用是取Spring配置文件中的内容,将之解析BeanDefinition并注到 BeanDefinitionRegistry工厂中。

作用是取 Spring 配置文件中的内容,将其转换为 IoC 容器内部的数结构:BeanDefinition。

 

public interface BeanDefinitionReader {

    //返回Bean工厂以向其注Bean定

    BeanDefinitionRegistry getRegistry();

    /**返回源加器以用于源位置。可以检查ResourcePatternResolver接口并行相转换,以针对给定的        源模式加多个源。

    一个null返回表明,绝对资源加用于个bean定义阅读器。

    主要用于bean定义资源中入其他源,例如,通XML bean定中的“ import”标记。但是,建      于定义资用此类导入;有明的完整源位置才会触发绝对资源加

    **/

    @Nullable

    ResourceLoader getResourceLoader();

    //返回用于Bean器。

    @Nullable

    ClassLoader getBeanClassLoader();

//返回BeanNameGenerator用于匿名Bean(未指定式Bean名称)。

    BeanNameGenerator getBeanNameGenerator();

    //指定的源加bean定

    int loadBeanDefinitions(Resource var1) throws BeanDefinitionStoreException;

    int loadBeanDefinitions(Resource... var1) throws BeanDefinitionStoreException;

    //指定的源位置加bean定

    //位置也可以是位置模式,前提是此bean定义读取器的ResourceLoader是ResourcePatternResolver。

    int loadBeanDefinitions(String var1) throws BeanDefinitionStoreException;

    int loadBeanDefinitions(String... var1) throws BeanDefinitionStoreException;

}

 

 

BeanDefinitionReader的实现类

BeanDefinitionReader 下有一个抽象子 AbstractBeanDefinitionReader,AbstractBeanDefinitionReader下有三个子

  • XmlBeanDefinitionReader:取 XML 文件定的 BeanDefinition
  • PropertiesBeanDefinitionReader:可以属性文件,Resource,Property 象等取 BeanDefinition
  • GroovyBeanDefinitionReader:可以取 Groovy 言定的 Bean

 

 

 

xml  properties  BeanDefinitionReader  BeanFactory  BeanDefinition  BeanFactoryPostProcessor  可 能 是 一 个 也 可 能 多 个  创 建 对 象  完 整  BeanDefinition 对  象  BeanDefinitionReader 是 加 载 配  置 文 件 的 统 一 接 囗 , 由 各 个 加 载 方  式 进 行 实 现 , 如 果 后 期 你 想 要 用  js 。 n 的 方 式 进 行 配 置 , 只 需 要 实 现  存 储 bean 的 定 义 信  后 置 增 强 器  对 BeanDefinition  对 象 进 行 扩 展 功 能  实 现 原 理 基 于 动 态  代 理 AOP  这 个 接 囗 即 可 ;  bean 生 命 周 期  对 象 的 实 例 化  对 象 的 初 始 化  完 整 对 象  销 毁  反 射

 

ApplicationContext

 

ApplicationContext承自BeanFactory,提供的功能更加

 

实现类

 

AnnotationConfigApplicationContext:一个或多个基于java的配置中加上下文定用于java注解的方式;

 

ClassPathXmlApplicationContext:路径下的一个或多个xml配置文件中加上下文定用于xml配置的方式;

ApplicationContext ac =new ("application.xml");

ClassPathXmlApplicationContext

 

ClassPathXmlApplicationContext如果没有前就是classpath

FileSystemXmlApplicationContext

ApplicationContext ac =new FileSystemXmlApplicationContext(/User/Desktop/application.xml);

FileSystemXmlApplicationContext如果没有前就是 file:

 

AnnotationConfigWebApplicationContext:一个或多个基于java的配置中加上下文定用于java注解的方式;

 

XmlWebApplicationContext:web用下的一个或多个xml配置文件加上下文定用于xml配置方式。

 

FileSystemXmlApplicationContext:文件系下的一个或多个xml配置文件中加上下文定,也就是统盘符中加xml配置文件;

 

 

Bean声明周期

1  f51J  4  InstantiationAwareBeanPostProcessor.postProcessBeforelnstantiation()  InstantiationAwareBeanPostProcessor.postProcessAfterlnstantiation()  InstantiationAwareBeanPostProcessor.postProcessPropertyValues()  5  6  populateBean  7  10  12  14  BeanPostProcessor.postProcessBeforelnitialization()  9 @PostConstruct  InitializingBean.afterPropertiesSet()  11  init—method  BeanPostProcessor.postProcessAfterlnitialization()  13  15  DisposableBean.destroy()  nttps?.//010g.cson.nevqqSpring Bean 生命周期

 

例化 -- InstantiationAwareBeanPostProcessor 

 

@Component

public class MyInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {

 

    // 例化前置

    @Override

    public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {

       

System.out.println("postProcessBeforeInstantiation被用了----在例化之前用-----beanName:" + beanName);

        // 都不,返回null

        return null;

    }

 

    // 例化后置

    @Override

    public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {

System.out.println("postProcessAfterInstantiation被用了---------beanName:" + beanName);

        //返回true,什也不继续下一

        return true;

    }

   

    // 属性修改

    @Override

    public PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException {

System.out.println("postProcessPropertyValues被用了---------beanName:"+beanName);

        // 此方法可bean中的属性值进行、添加、修改、除操作;

        // 属性值进行修改,如果postProcessAfterInstantiation方法返回false,方法可能不会被用,

        return pvs;

    }

}

 

初始化---容器属性赋值

2,  1, BeanNameAware.setBeanName()  BeanClassLoaderAware.setBeanClassLoader()  3, BeanFactoryAware.setBeanFactory()  4, EnvironmentAware.setEnvironment()  5,  EmbeddedValueResolverAware.setEmbeddedValueR  esolver()  6, ResourceLoaderAware.setResourceLoader()  ApplicationEventPublisherAware.setApplicationEven  tPublishe  8, MessageSourceAware.setMessageSource()  ApplicationContextAware.setApplicationContext()  10, ServletContextAware.setServletContext()

 

public class AllAwareInterface  implements BeanNameAware, BeanClassLoaderAware,

        BeanFactoryAware, EnvironmentAware, EmbeddedValueResolverAware,

        ResourceLoaderAware, ApplicationEventPublisherAware, MessageSourceAware,

        ApplicationContextAware, ServletContextAware, LoadTimeWeaverAware, ImportAware {

 

    @Override

    public void setBeanName(String name) {

        // BeanNameAware作用:BeanName有知

        //个方法简单的返回我当前的beanName,听官方的意思是个接口更多的使用在spring的架代中,实际开发环应该不建使用

        System.out.println("1 我是 BeanNameAware 的 setBeanName 方法---参数:name,内容:"+ name);

    }

    @Override

    public void setBeanClassLoader(ClassLoader classLoader) {

        System.out.println("2 我是 BeanClassLoaderAware 的 setBeanClassLoader 方法");

    }

    @Override

    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {

        // 注意: 如果使用 @Configuration 注解的,setBeanFactory方法会行2次,

        System.out.println("3 我是 BeanFactoryAware 的 setBeanFactory 方法");

    }

    @Override

    public void setEnvironment(Environment environment) {

        System.out.println("4 我是 EnvironmentAware 的 setEnvironment 方法");

    }

    @Override

    public void setEmbeddedValueResolver(StringValueResolver stringValueResolver) {

        System.out.println("5 我是 EmbeddedValueResolverAware 的 setEmbeddedValueResolver 方法");

    }

    @Override

    public void setResourceLoader(ResourceLoader resourceLoader) {

        System.out.println("6 我是 ResourceLoaderAware 的 setResourceLoader 方法");

    }

    @Override

    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {

        System.out.println("7 我是 ApplicationEventPublisherAware 的 setApplicationEventPublisher 方法");

    }

    @Override

    public void setMessageSource(MessageSource messageSource) {

        System.out.println("8 我是 MessageSourceAware 的 setMessageSource 方法");

    }

    @Override

    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {

        System.out.println("9 我是 ApplicationContextAware 的 setApplicationContext 方法");

    }

    @Override

    public void setServletContext(ServletContext servletContext) {

        System.out.println("10 我是 ServletContextAware 的 setServletContext 方法");

    }

    @Override

    public void setLoadTimeWeaver(LoadTimeWeaver loadTimeWeaver) {

        //LoadTimeWeaver 称LTW,LTW是AOP的一种实现方式,此方法是取Aop入的象,使用的入方式是:入,

        // 一般的aop都是行期入,就是在行的候才入切面方法,但是LTW是在前就被入了,也就是class文件在jvm加之前入切面方法

        // 有在使用 @EnableLoadTimeWeaving 或者存在 LoadTimeWeaver 实现的 Bean 才会用,序也

        System.out.println("11 我是 LoadTimeWeaverAware 的 setLoadTimeWeaver 方法");

    }

    @Override

    public void setImportMetadata(AnnotationMetadata annotationMetadata) {

        //有被其他配置 @Import(XX.class) 才会用, XX.class 中的所有 @Bean 来说顺序是第 1 的。

        System.out.println("12 我是 ImportAware 的 setImportMetadata 方法");

    }