Spring注解应用

将Bean交给Spring IOC容器管理的相关注解:

  • @ComponentScan注解:用在会被Spring实例化的类上,扫描@Controller、@Service、@Repository、@Component
@Component
public class User {

    public User() {
        System.out.println("User was Instantiated");
    }
}
@ComponentScan(basePackages = "com.demo.test")
public class ConfigClass {}
public class MainClass {

    public static void main(String[] args) {

        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(ConfigClass.class);
        System.out.println(ctx.getBean("user"));
    }
}
//结果
//User was Instantiated
//com.demo.test.User@161b062a
  • @Bean注解:用在会被Spring实例化的类中,通常用来引入外部组件
public class User {

    public User() {
        System.out.println("User was Instantiated");
    }
}
public class ConfigClass {

    @Bean
    //@Bean(value="u")//Bean的name默认为方法名,可以自己指定
    //@Lazy//配合@Bean实现懒加载
    public User user(){
        return new User();
    }
}
public class MainClass {

    public static void main(String[] args) {

        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(ConfigClass.class);
        System.out.println(ctx.getBean("user"));
    }
}
//结果
//User was Instantiated
//com.demo.test.User@971d0d8
  • @Conditional注解:判断是否实例化该Bean,通常与@Bean配合使用
//与@Bean注解配合
public class User {

    public User() {
        System.out.println("User was Instantiated");
    }
}
public class UserCondition implements Condition {

    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        return false;
    }
}
public class ConfigClass {

    @Bean
    @Conditional(value = UserCondition.class)
    public User user(){
        return new User();
    }
}
public class MainClass {

    public static void main(String[] args) {

        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(ConfigClass.class);
        System.out.println(ctx.getBean("user"));
    }
}
//结果
//No bean named 'user' available
//与@ComponentScan注解配合
@Component
@Conditional(value = UserCondition.class)
public class User {

    public User() {
        System.out.println("User was Instantiated");
    }
}
public class UserCondition implements Condition {

    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        return false;
    }
}
@ComponentScan(basePackages = "com.demo.test")
public class ConfigClass {}
public class MainClass {

    public static void main(String[] args) {

        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(ConfigClass.class);
        System.out.println(ctx.getBean("user"));
    }
}
//结果
//No bean named 'user' available
  • @Import注解:用在会被Spring实例化的类上,通常用来引入外部组件,组件ID为全类名路径
public class User {

    public User() {
        System.out.println("User was Instantiated");
    }
}
@Import(value = {User.class})
public class ConfigClass {}
public class MainClass {

    public static void main(String[] args) {

        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(ConfigClass.class);
        System.out.println(ctx.getBean("com.demo.test.User"));
    }
}
//结果
//User was Instantiated
//com.demo.test.User@5d20e46
  • FactoryBean接口:懒加载,用于实例化过程中存在复杂逻辑的组件,例如SqlSessionFactory
public class User {

    public User() {
        System.out.println("User was Instantiated");
    }
}
public class UserFactoryBean implements FactoryBean<User> {

    @Override
    public User getObject() throws Exception {
        return new User();
    }
    @Override
    public Class<?> getObjectType() {
        return User.class;
    }
    @Override
    public boolean isSingleton() {
        return true;
    }
}
public class MainClass {

    public static void main(String[] args) {

        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(UserFactoryBean.class);
        System.out.println(ctx.getBean(User.class));
    }
}
//结果
//User was Instantiated
//com.demo.test.User@1efee8e7

操作Bean生命周期的相关注解:

  • @Bean(init = “”, destroy = “”)指定初始化方法和销毁方法
public class User {

    public User() {
        System.out.println("constuct : run");
    }
    public void a(){
        System.out.println("init : run");
    }
    public void b(){
        System.out.println("destroy : run");
    }
}
public class ConfigClass {

    @Bean(initMethod = "a", destroyMethod = "b")
    public User user(){
        return new User();
    }
}
public class MainClass {

    public static void main(String[] args) {

        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(ConfigClass.class);
        ctx.close();
    }
}
//结果
//constuct : run
//init : run
//destroy : run
  • 通过JSR250规范注解@PostConstruct 和@PreDestory指定初始化方法和销毁方法
public class User {

    public User() {
        System.out.println("constuct : run");
    }
    @PostConstruct
    public void a(){
        System.out.println("init : run");
    }
    @PreDestroy
    public void b(){
        System.out.println("destroy : run");
    }
}
public class ConfigClass {

    @Bean()
    public User user(){
        return new User();
    }
}
public class MainClass {

    public static void main(String[] args) {

        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(ConfigClass.class);
        ctx.close();
    }
}
//结果
//constuct : run
//init : run
//destroy : run
  • 通过DisposableBean接口重写销毁方法
public class User implements DisposableBean {

    public User() {
        System.out.println("constuct : run");
    }
    @Override
    public void destroy() throws Exception {
        System.out.println("destroy : run");
    }
}
public class ConfigClass {

    @Bean()
    public User user(){
        return new User();
    }
}
public class MainClass {

    public static void main(String[] args) {

        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(ConfigClass.class);
        ctx.close();
    }
}
//结果
//constuct : run
//destroy : run

操作Bean的属性的相关注解

  • 通过InitializingBean接口,属性赋值完成后,调用afterPropertiesSet()方法,可以在此处修改属性
public class User implements InitializingBean {
    
    public User() {
        System.out.println("constuct : run");
    }
    public void a(){
        System.out.println("init : run");
    }
    public void b(){
        System.out.println("destroy : run");
    }
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("afterPropertiesSet : run");
    }
}
public class ConfigClass {

    @Bean(initMethod = "a", destroyMethod = "b")
    public User user(){
        return new User();
    }
}
public class MainClass {

    public static void main(String[] args) {

        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(ConfigClass.class);
        ctx.close();
    }
}
//结果
//constuct : run
//afterPropertiesSet : run
//init : run
//destroy : run
  • 通过BeanPostProcessor接口,Bean后置处理器,拦截所有Bean的创建过程,可以对Bean的属性进行操作
public class User {

    public User() {
        System.out.println("constuct : run");
    }
    public void a(){
        System.out.println("init : run");
    }
    public void b(){
        System.out.println("destroy : run");
    }
}
public class BeanPostProcessorImpl implements BeanPostProcessor {
	//init方法之前执行
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {

        if ("user".equals(beanName)) System.out.println("postProcessBeforeInitialization");
        return bean;
    }
    //init方法之后执行
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {

        if ("user".equals(beanName)) System.out.println("postProcessAfterInitialization");
        return bean;
    }
}
public class ConfigClass {

    @Bean(initMethod = "a", destroyMethod = "b")
    public User user(){
        return new User();
    }
    @Bean()
    public BeanPostProcessorImpl beanPostProcessorImpl(){
        return new BeanPostProcessorImpl();
    }
}
public class MainClass {

    public static void main(String[] args) {

        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(ConfigClass.class);
        ctx.close();
    }
}
//结果
//constuct : run
//postProcessBeforeInitialization
//init : run
//postProcessAfterInitialization
//destroy : run
  • 通过@Value注解 + @PropertySource注解方式,给属性赋值
#user.yml
user:
  name: 456
public class User {

    @Value(value = "${name}")//赋值动作发生在构造方法之后
    private String name = "123";

    public User() {
        System.out.println("constuct : run : " + name);
    }
    public void a(){
        System.out.println("init : run : " + name);
    }
    public void b(){
        System.out.println("destroy : run : " + name);
    }
}
@PropertySource(value = {"classpath:user.yml"})
public class ConfigClass {

    @Bean(initMethod = "a", destroyMethod = "b")
    public User user(){
        return new User();
    }
}
public class MainClass {

    public static void main(String[] args) {

        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(ConfigClass.class);
        ctx.close();
    }
}
//结果
//constuct : run : 123
//init : run : 456
//destroy : run : 456
  • 通过@Autowired注解,给属性赋值
public class User {

    @Autowired
    private Environment environment;

    public User() {
        System.out.println("constuct : run : environment : " + environment);
    }
    public void a(){
        System.out.println("init : run : environment : " + environment);
    }
    public void b(){
        System.out.println("destroy : run : environment : " + environment);
    }
}
public class ConfigClass {

    @Bean(initMethod = "a", destroyMethod = "b")
    public User user(){
        return new User();
    }
}
public class MainClass {

    public static void main(String[] args) {

        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(ConfigClass.class);
        ctx.close();
    }
}
//结果
//constuct : run : environment : null
//init : run : environment : StandardEnvironment
//destroy : run : environment : StandardEnvironment
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值