BeanFactory接口提供了一个抽象的配置和对象的管理机制
。
ApplicationContext是BeanFactory的子接口。它简化了与AOP的整合,消息机制,事件机制以及对web的扩展。
(1)AOP的支持。AnnotationAwareAspectJAutoProxyCreator
作用于Bean的初始化之后。
(2)配置元信息。
(3)资源管理(Resource抽象)
(4)事件驱动机制(ApplicationEvent,ApplicationListener)
(5)Environment抽象
在xml中药引用注解配置,需要开启注解配置,同时注册对应的配置类:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!-- 开启注解配置 -->
<context:annotation-config />
<bean class="com.test.spring.annotation.config.AnnotationConfiguration"/>
</beans>
注解引用xml
在注解配置中引用xml,需要在配置类上标注@ImportResource
注解,并声明配置文件路径。
@Configuration
@ImportResource("classpath:annotation/application.xml")
public class AnnotationConfiguration {
}
引入外部配置文件
通过注解类引入,添加注解@propertySource
配置类中通过注解@PropertySource
引用properties配置文件。
在扫描类中可以通过占位符
来表示注入。${key},key为properties中的key。
<context:property-placeholder location="classpath:mysql.properties" />
对象的注入(component组件类)
通过注解@Autowire
完成对象注入。也可以通过注解@Resource
完成对象注入(这个是按照属性名/Bean的名称注入,这个是属于JSR规范的注解))。@Inject
注入(根据类型注入,这个是属于JSR规范的注解)。
如果IOC容器中包含两个类型相同的bean。可以通过注解@Qualifier
,指定注入bean的名称。也可以将要注入的bean上标注注解@Primary
,含义是默认注入的Bean。
@Autowired注入的原理逻辑:
先拿属性对应的类型,去 IOC 容器中找 Bean ,如果找到了一个,直接返回;如果找到多个类型一样的 Bean , 把属性名拿过去,跟这些 Bean 的 id 逐个对比,如果有一个相同的,直接返回;如果没有任何相同的 id 与要注入的属性名相同,则会抛出 NoUniqueBeanDefinitionException
异常。
回调注入的核心是一个叫Awarre
接口。它来自springframework。
常用的几个回调接口:
简单使用,比如ApplicationContextAware的使用。我们类中只需要实现接口ApplicationContextAware
。重写setApplicationContext
方法即可。
public class AwaredTestBean implements ApplicationContextAware {
private ApplicationContext ctx;
@Override
public void setApplicationContext(ApplicationContext ctx) throws BeansException {
this.ctx = ctx;
}
}
上面代码的含义就是,当AwaredTestBean被初始化好
的时候,就会把ApplicationContext传给它
。
只需要将注入的类型封装为ObjectProvider
。
@Autowired
private ObjectProvider<Person> person;
依赖注入的目的与优点:
- 依赖注入作为 IOC 的实现方式之一,目的就是
解耦
。 - 依赖注入的另一个特点是依赖对象的
可配置
。通过 xml 或者注解声明,可以指定和调整组件注入的对象,借助 Java 的多态特性,可以不需要大批量的修改就完成依赖注入的对象替换(面向接口编程与依赖注入配合近乎完美)。
BeanFactory
:spring中实现IOC的最底层容器。从类的继承体系上看,它是最顶层的接口,也就是最顶层的容器实现。从类的组合结构上看,它则是最深层次的容器。
FactoryBean
:它是bean的一种类型,可以使用它来直接创建一些初始化流程比较复杂的对象。
为什么会出现不同的作用域?
资源是有限的。如果一个资源允许同时被多个地方访问,那就可以把作用域提高。反正,如果一个资源伴随着一个时效性强的,带强状态的动作,那么这个作用域就应该局限于这一个动作,不能被这个动作之外的干扰。
spring框架内置的作用域:
- 在spring配置文件中,组件
的配置有个属性init-method
,可以配置要执行初始化的方法。destroy-method
可以指定销毁方法。 - 在配置类中,有个注解
@Bean
中有个属性initMethod
可以指定初始化方法。destroyMethod
可以指定销毁方法。
这两种方法都有以下特征:
(1)方法的访问权限无要求。spring会通过反射获取。
(2)方法无参数。
(3)方法无返回值。
(4)可以抛出异常。
这两也是spring框架内部预先定义好的两个关于生命周期的额接口。
实现InitializingBean
接口,重写afterPropertiesSet
方法,完成初始化。
实现DisposableBean
接口,重写destroy
方法,完成销毁方法。
JSR规范中负责生命周期的注解,包括@PostConstruct
、@PreDestroy
两个注解,他们分别对应init-method
和destroy-method
。
当三种初始化方式都存在的时候,他们的执行顺序为:@PostConstruct
→ InitializingBean
→ init-method
。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)