Spring注解
@Configuration&@Bean配置类 & 添加组件@Configuration定义一个配置类替换xml文件,在配置类中可以通过方法注册组件,方法的返回值是组件的类型,返回值是组件对象,组件名默认为方法名@Bean标注在配置类的方法上,将方法的返回对象注册到IOC容器中,@Bean内有一个name参数可以是显示指定组件名称@Configurationpublic class MyConfig {@Bean("print")public PrintBean printBean(){return new PrintBean();}}
@ComponentScan&TypeFilter组件扫描
@ComponentScan 注解中可以配置扫描路径(basePackage),扫描的类文件,包含的组件和排除的组件
@ComponentScan(basePackages = {"org.example.controller","org.example.dao"})@ComponentScan(basePackageClasses = {UserController.class, UserService.class})@ComponentScan(basePackages = {"org.example"},includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Controller.class}),@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,classes = {UserController.class, UserService.class})},excludeFilters = {@ComponentScan.Filter(classes = {Repository.class,Service.class}),@ComponentScan.Filter(type = FilterType.CUSTOM,classes = {MyTypeFilter.class})})
在@ComponentScan.Filter注解中,type属性为FilterType的枚举类型
public enum FilterType {//按照注解进行过滤ANNOTATION,//按照制定类型进行过滤ASSIGNABLE_TYPE,//按照ASPECTJ表达式进行过滤ASPECTJ,//按照正则表达式进行过滤REGEX,//按照自定义规则进行过滤CUSTOM}
如果预置的几种方式不能满足需求,需要使用自定义过滤规则可以实现TypeFilter接口,重写match()方法
public class MyTypeFilter implements TypeFilter {@Override/*** @return true 表示符合过滤规则* false 没有匹配过滤规则*/public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {//获取当前类的注解信息AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();//获取当前正在扫描类的信息ClassMetadata classMetadata = metadataReader.getClassMetadata();//获取当前资源类(类路径)Resource resource = metadataReader.getResource();//返回类的全限定名String className = classMetadata.getClassName();if (className.substring(className.lastIndexOf(".")+1).equalsIgnoreCase("userController")){return true;}return false;}}
**@Scope**设置组件作用域:singleton单例(默认)prototype多例
@Lazy 懒加载
**@Conditional**按条件注册
可以标在类上或方法上,@Conditional的注解中需要传入一个Condition数组,Condition数组的matches()方法返回true的会进行组件注册。标在类上满足条件这个类的所有对象才会注册到容器中,标在方法上,满足条件,该方法的组件才会注册到容器中。
public class WindowsCondition implements Condition {@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {//获取IOC容器的BeanFactoryConfigurableListableBeanFactory beanFactory = context.getBeanFactory();//获取类加载器ClassLoader classLoader = context.getClassLoader();//获取到BeanDefinition的注册类BeanDefinitionRegistry registry = context.getRegistry();//获取到当前环境信息Environment environment = context.getEnvironment();if (environment.getProperty("os.name").contains("Windows")){return true;}return false;}}
@Import给容器中注册组件
给容器中注册组件方法
- 包扫描+组件标注注解[
@Controller/@Service/@Repository/Component] @Bean[导入第三方包里的组件]@Import[快速给容器导入组件]@Import(要导入的组件):容器中会自动注册这个组件,id为类的全限定名ImportSelector:返回需要导入组件的全限定名数组ImportBeanDefinitionRegistrar:手动注册组件
FactoryBean使用Spring提供的FactoryBean- 默认获取到的 工厂调用getObject()创建的对象
要获取工厂Bean本身,需要在id前加一个’&‘
public interface BeanFactory {String FACTORY_BEAN_PREFIX = "&";....}
- Bean的生命周期
Bean的生命周期:
容器管理Bean的生命周期:
我们可以自定义初始化和销毁方法,容器在bean进行到当前生命周期的时候来调用我们自定义的初始化和销毁方法
构造(对象创建)
- 单实例
Singleton:在容器启动时创建对象 - 多实例
Prototype:在每次获取时创建对象
初始化
- 对象创建完成,并赋值后,调用初始化方法
销毁
- 单实例
Singleton:容器关闭时调用销毁方法 - 多实例
Prototype:容器并不管理多实例Bean,容器不会调用这个Bean的销毁方法
指定初始化及销毁方法;
- 通过@Bean指定
init-mehod和destroy-method - 实现
InitializingBean、DisposableBean接口 - 使用JSR250标准推出的注解
**@PostConstruct**和**@PreDestroy**
BeanPostProcessor后置处理器
public interface BeanPostProcessor {/*** 支持BeanPostProcessor在一个bean对象的任何初始化方式之前的回调,* 并可以返回一个bean的包装对象或不做改变*/@Nullabledefault Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {return bean;}/*** 支持BeanPostProcessor在一个bean对象的任何初始化方式之后的回调,* 并可以返回一个bean的包装对象或不做改变*/@Nullabledefault Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {return bean;}}
Bean生命周期顺序
**@Value**&@**PropertySource**
**@Value** 可以给类的属性赋值,一共有三种方式
- 基本数值
- 使用SpEL:
#{} - 使用
${},可以读出配置文件内的值
**@PropertySource** 将配置文件与资源类绑定,这样使用#{}就能读到配置文件中的k/v值,但是注意如果配置文件内有中文字符,还需要设置encode="UTF-8",否则会出现乱码问题
**@Autowired**&**@Qualifier**&**@Primary**
@Autowired 自动注入
- 默认按照类型去容器中查找组件进行注入
- 如果容器中有多个类型相同的组件,则会按照属性名进行查找
**@Qualifier**按照指定的id查找组件- 自动装配默认容器中一定要有可以注入的组件,否则会报错可以修改
**required = false** **@Primary**当容器中没有符合条件的组件会自动注入**@Primary**标注的组件
**@Resource**和**@Inject**都可以实现自动注入,但是这两个注解都是Java规范**@Resource**优先按照名字进行匹配,如果查找不到再按照类型进行匹配,并且不支持**@Qualifier**和**@Primary****@Inject**支持**@Qualifier**和**@Primary**,但注解内不含有属性所以不支持**required = false**
- AOP
通知方法:**@Before** 在目标方法运行之前执行 **@After** 在目标方法运行结束后运行**@AfterReturning** 在目标方法返回之后运行**@AfterThrowing** 在目标方法抛出异常时执行
应该将切面类和目标类交由IOC容器管理,在切面类上标注**@Aspect**表明这是一个切面,并在配置类上开启自动代理**@EnableAspectJAutoProxy**
