玩命加载中 . . .

Spring注解驱动


Spring注解驱动

1.容器

组件添加

@Configuration

告诉Spring这是一个配置类

@Bean

在配置类中注册一个Bean

类型为返回值的类型,id默认为方法名的Id,也可以通过@Bean(“persion”)来命名id

@ConponentScan(”com.atguigu”)

加在配置类的类上,扫描包

可以指定排除规则 @ConponentScan(value=”com.atguigu”,excludeFilters = { @Filter(type=FilterType.ANNOTATION,classes={Controller.class})}):根据注解排除Controller注解

也可以指定包含规则@ConponentScan(value=”com.atguigu”,includeFilters = { @Filter(type=FilterType.ANNOTATION,classes={Controller.class})},useDefaultFilters = false):根据注解只包含Controller注解,前提要禁用掉默认的过滤规则

也可以指定类型@ConponentScan(value=”com.atguigu”,includeFilters = { @Filter(type=FilterType.ASSIGNABLE_TYPE,classes={BookService.class})},useDefaultFilters = false):BookService一定会包含进去

@Scope(“”)

加在@bean上,指定作用范围

值:prototype:多实例,singleton:单实例

多实例:在容器创建时不会被调用,获取几次就调用几次

单实例:在容器创建时被调用,获取的时候直接拿出来即可,多次调用的是一个对象

@Lazy

加在@Bean上,懒加载

转对单实例对象,在容器创建时不会被调用,获取使才会被加载,并且获取的是单例对象

@Conditional({WindowsCondition.class})

可以加在@bean上,根据条件判断(WindowsCondition就是一个自动的判断方法),如果返回true,则该bean会加载容器中

也可以加在类上,返回为true,该类下的所有@Bean都会被加在容器中

@Import({color.class})

加在配置类上,快速加载组件,不需要使用无参构造器+@bean的方式

@Import({MyImportSelector.class})

加在配置类上,加载自定义方法的返回值指定的全类名组件

class MyImportSelector implements ImportSelector{
//实现方法,方法返回值就是需要导入容器中的全类名
return new String[]{"com.atguigu.bean.blue","com.atguigu.bean.red"}
}

@Import({MyImportBeanDefinitionRegister.class})

加在配置类上,加载自定义方法中自定义的组件

class MyImportBeanDefinitionRegister implements ImportBeanDefinitionRegistrar{
    //实现方法,判断是否存在red组件,如果存在,就自定义创建一个rainbow组件
    boolean definition = registry.containsBeanDefinition("com.atguigu.bean.Red");
    if(defintion){
        //Bean的类型
        RootBeanDefinition beanDefintion =new RootBeanDefinition(RainBow.class);
        //Bean的id,Bean的类型
        registry.registerBeanDefinition("rainbow",beanDefintion)
    }
}

FactoryBean创建组件

使用@Bean的方式FactoryBean创建组件,实际上创建的是Color组件

加在配置类中
@Bean
public ColorFactoryBean colorFactoryBean(){
    return new ColorFactoryBean();
}
class ColorFactoryBean implements FactoryBean<Color>(){
    //重写getObject:创建bean对象
    return new Color()
    //重写getObjectType:设置对象类型
    return Color.class
    //重写isSingleton:设置是否为单例,true为单例
    return true 
}

如果想获取FactoryBean本身,在获取的时候前面加个&

生命周期

1. @Bean(initMethod=”init”,destoryMethod=”destory”)

指定生命周期方法,init和destory为自己定义的

对象创建:

  • 单实例:在容器启动时创建

  • 多实例:在每次获取时创建

初始化:

  • 对象创建完成,并赋值好,调用初始化方法

销毁:

  • 单实例:容器关闭的时候

  • 多实例:容器不会管理Bean,容器不会调用销毁方法

2. 通过让Bean实现InitializingBean和DisposableBean接口

实现destory和Init方法

3. @PostConstruct(初始化)、@PreDestroy(容器移除对象前:销毁)

在Bean的init方法和destory方法中,加上以上两个注解

4. 后置处理器BeanPostProcessor(类似监听器)

写一个后置处理器,实现BeanPostProcessor,

实现两个方法:

postProcessBeforeInitialization:初始化前调用

postProcessAfterInit ialization:初始化后调用

组件赋值

@Value

在Bean的属性上赋值

1.基本数值

2.可以写SpEL #{ }

3.可以写${ },取出配置文件中的值,前提要有@PropertySource加载配置文件

@PropertySource({“classpath:/person.properties”})

加在配置类上,读取外部配置文件中保存的k/v

自动装配(注入)

@Autowired ,Spring定义的

加在属性上,自动装配

1.默认优先按照类型去容器中找对应组件

2.如果找到多个相同类型的组件,再将属性名称作为容器的id在容器中查找

3.@Qualifier(”bookDao”),指定需要装配的id,而不是使用属性名

4.自动装配默认一定要将属性赋值好,没有找到相应组件就会报错

​ 可以使用@Autowired(required=false),没有装配也不会报错

5.@Primary,在没有明确指定时,这个注解是首选装配,忽略属性名

还可以加在有参构造器、参数、方法上,都是从容器中拿到并自动装配,如果只有一个参数,可以省略@Autowired

@Resource(name=””) JSR250,Java规范的注解

可以和@Autowried一样实现自动装配功能,默认按照组件名称装配

不支持@Primary,@Autowired(required=false)功能

@Inject JSR330,Java规范的注解

需要导入javax.inject的包,和Autowired的功能一样

xxxAware

自定义组件实现XXXAware,在创建对象的时候,会调用接口规定的方法注入相关组件

把Spring底层的一些组件注入到自定义的Bean中

@Profile(””)

加在@Bean上,根据环境注册Bean

1.使用命令行动态参数:在虚拟机参数位置加载 -Dspring.profiles.active=test

2.代码的方式激活某种环境

(1)创建一个applicationContext

(2)设置需要激活的环境,applicationContext.getEnvironment().setActiveProfiles(“test”,”dev”)

(3)注册主配置类,applicationContext.register(MainConfigOfProfile.class)

(4)启动刷新容器,applicationContext.refresh()

加在配置类上,只有是该指定的环境,整个配置类才会起作用

没有标注环境标识的Bean,在任何环境下都是加载的


文章作者: 小苏
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小苏 !
评论
  目录