[email protected]相关注解总结

下面来介绍如何使用@Condition

[html] view plain copy

  1. public class TestCondition implements Condition
  2. {
  3. /**
  4. * 只有返回true,才会启用配置
  5. */
  6. public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata)
  7. {
  8. return true;
  9. }
  10. }

@Conditional(TestCondition.class)

这句代码可以标注在类上面,表示该类下面的所有@Bean都会启用配置,也可以标注在方法上面,只是对该方法启用配置。

spring框架还提供了很多@Condition给我们用,当然总结用语哪种好理解,看给位读者喽

@ConditionalOnBean(仅仅在当前上下文中存在某个对象时,才会实例化一个Bean)
@ConditionalOnClass(某个class位于类路径上,才会实例化一个Bean)
@ConditionalOnExpression(当表达式为true的时候,才会实例化一个Bean)
@ConditionalOnMissingBean(仅仅在当前上下文中不存在某个对象时,才会实例化一个Bean)
@ConditionalOnMissingClass(某个class类路径上不存在的时候,才会实例化一个Bean)
@ConditionalOnNotWebApplication(不是web应用)

后续会继续补充

另一种总结

@ConditionalOnClass:该注解的参数对应的类必须存在,否则不解析该注解修饰的配置类;
@ConditionalOnMissingBean:该注解表示,如果存在它修饰的类的bean,则不需要再创建这个bean;可以给该注解传入参数例如@ConditionOnMissingBean(name = "example"),这个表示如果name为“example”的bean存在,这该注解修饰的代码块不执行。

接上文

condition自定义声明

public class InitConditional implements Condition{

    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        //判断是否已经包含了amazonTest Bean
        Boolean bol =  conditionContext.getBeanFactory().containsBean("amazonTest");
        return bol;
    }
}

使用自定义的Conditional

@Component
@Conditional(InitConditional.class)
public class AmazonTest {

    @Autowired
    private AmazonProperties amazonProperties;

    public void testGet(){
        System.out.println("    testGet Associated");
        System.out.println(amazonProperties.getAssociateId());
    }
}

WelcomeController 与 AmazonTest关联,使用ConditionOnBean(如果条件的bean存在,当前的bean才会被声明)

@Component
@ConditionalOnBean(AmazonTest.class)
public class WelcomeController {
    private static final Logger logger = LoggerFactory.getLogger(WelcomeController.class);

    private AppProperties app;
    private GlobalProperties global;

    @Autowired
    public void setApp(AppProperties app) {
        this.app = app;
    }

    @Autowired
    public void setGlobal(GlobalProperties global) {
        this.global = global;
    }

    public void testWelcome(){
        String appProperties = app.toString();
        String globalProperties = global.toString();
        System.out.println(appProperties);
        System.out.println(globalProperties);
    }
}

main测试文件入口

public static void main(String[] args) {
        ConfigurableApplicationContext configurableApplicationContext =SpringApplication.run(DemoApplication.class, args);
        //bean自动注册,根据bean的名字获取Bean
        AmazonProperties amazonProperties = (AmazonProperties) configurableApplicationContext.getBean("amazonProperties");
        System.out.println(amazonProperties.getAssociateId());

        Boolean aBooleanWelcomeController = configurableApplicationContext.containsBean("welcomeController");
        if(!aBooleanWelcomeController){
            System.out.println("        welcomeController init fail");
        }else{
            WelcomeController welcomeController = (WelcomeController) configurableApplicationContext.getBean("welcomeController");
            System.out.println("        welcomeController init Success");
        }

        Boolean    aBooleanAmazonTest = configurableApplicationContext.containsBeanDefinition("amazonTest");
        if(!aBooleanAmazonTest){
            System.out.println("        amazonTest init fail");
        }else{
            AmazonTest amazonTest = (AmazonTest) configurableApplicationContext.getBean("amazonTest");
            System.out.println("        amazonTest init Success");
        }
}
时间: 2024-10-06 01:49:53

[email protected]相关注解总结的相关文章

springmvc4 相关注解的详细讲解

[email protected] Controller控制器是通过服务接口定义的提供访问应用程序的一种行为,它解释用户的输入,将其转换成一个模型然后将试图呈献给用户.Spring MVC 使用 @Controller 定义控制器,它还允许自动检测定义在类路径下的组件并自动注册.如想自动检测生效,需在xml头文件下引入 spring-context: <?xml version="1.0" encoding="UTF-8"?> <beans xml

[技术分享][email&#160;protected] @After @AfterReturning @Around @AfterThrowing spring aop 的advise(通知)

今天在项目中成功实现了spring aop . @Before @After @AfterReturning @Around @AfterThrowing 这五个是实现spring aop常用的五个注解 相关的注解还有@Aspect @Component @PointCut 我在实践中发现: [email protected] @After @AfterReturning @Around 这四个通知只有用一种,如果使用两种及以上会发生一些问题. [email protected]@PointCu

Spring中@相关注解的意义

1.@controller 控制器(注入服务) 用于标注控制层,相当于struts中的action层 2.@service 服务(注入dao) 用于标注服务层,主要用来进行业务的逻辑处理 3.@repository(实现dao访问) 用于标注数据访问层,也可以说用于标注数据访问组件,即DAO组件. 4.@component (把普通pojo实例化到spring容器中,相当于配置文件中的 <bean id="" class=""/>) 泛指各种组件,就是说

Spring框架[email&#160;protected]

使用@Resource注解,实现组件装配,默认按照名称匹配. 下面的类都是使用到注解的类: 1 package dao.impl; 2 3 import org.springframework.stereotype.Repository; 4 5 import dao.UserDao; 6 import entity.User; 7 8 /** 9 * 用户DAO类,实现IDao接口,负责User类的持久化操作 10 */ 11 @Repository("userDao") 12 pu

springboot情操陶冶[email&#160;protected]注解解析

承接前文springboot情操陶冶[email protected]注解解析,本文将在前文的基础上对@SpringBootApplication注解作下简单的分析 @SpringBootApplication 该注解是springboot最集中的一个注解,也是应用最广泛的注解.官方也多用此注解以启动spring服务,我们看下其中的源码 @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inher

[email&#160;protected] 注解原理与使用

Java反射 java反射机制的定义: 在运行转态时(动态的)时. 对于任意一个类,都能够知道这个类的所有属性和方法 对于任意一个对象,都能够知道调用它的任意属性和方法 Class对象 java中用对象来对现实生活中的事物进行抽象,如人(现实生活)抽象到一个person类(java对象).但有没有想过,java中的类(现实生活)其实也是一个Class对象(对象).因此,这个Class类就包含了所有你定义的Class信息,包括所有的方法(私有,公有).构造器.实现了那些方法.哪些注解信息.所有的属

[email&#160;protected]注解与自动装配

1   配置文件的方法 我们编写spring 框架的代码时候.一直遵循是这样一个规则:所有在spring中注入的bean 都建议定义成私有的域变量.并且要配套写上 get 和 set方法. Boss 拥有 Office 和 Car 类型的两个属性:       清单 3. Boss.java [java] view plaincopy package com.baobaotao; public class Boss { private Car car; private Office office

Spring高级话题[email&#160;protected]***注解的工作原理

出自:http://blog.csdn.net/qq_26525215 @EnableAspectJAutoProxy @EnableAspectJAutoProxy注解 激活Aspect自动代理 <aop:aspectj-autoproxy/> 开启对AspectJ自动代理的支持. 在用到AOP的自动代理的时候用,如果你理解了Java的动态代理,很容易的就会熟悉AOP的自动代理的. @EnableAsync @EnableAsync注解开启异步方法的支持. 这个相信大家都比较熟悉的.对于异步

springboot情操陶冶[email&#160;protected]和@AutoConfigureAfter注解解析

承接前文springboot情操陶冶[email protected]注解解析,本文将在前文的基础上阐述@AutoConfigureAfter和@Conditional注解的作用与解析 [email protected] 根据单词来理解,其就是条件的意思.在分析之前我们可以看下其内部源码 @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @i