一、Spring注解介绍

  Spring(这里的Spring指的是Spring中所有的框架集合)中有很多注解,但常用的也就那么多。下面据简单的介绍下常用的注解使用:
(架构师之路③群:256909960,欢迎加入)
一、IOC容器
  存储的都是Bean,再在这里面进行各种Bean之间可以根据Bean的名称或Bean的类型进行装配;bean在容器中是一个个实例对象,他们有类型也有名称。通过类型或者名称进行装配和组合。
初始化Bean的两种方式:
1)通过@ComponentScan和@Controller;@Repository;@Component;@service四种搭配声明
2)通过在@Configuration中使用@Bean
 
1、声明Bean的注解
  在类上加上这些注解后,Spring启动后会自动初始化这些类,生成对应的实例对象
  @Controller:在展现层使用(MVC->SpringMVC)
  @Service:业务逻辑是服务层(service)使用
  @ Repository:数据访问层(dao)使用
  @Component:组件没有明确的角色 前面的四个实质上没有什么区别
注:在SpringMVC中@Controller被赋予了特殊的功能,不能倍其他的注解代替
  @Bean:注解声明当前的方法返回的是一个Bean,这个Bean的类型是对应的方法返回值类型,Bean的名称默认是方法名,也可以自定义:@Bean(name="自定义名称")
(架构师之路③群:256909960,欢迎加入)
2、注入Bean的注解
  在属性或setter方法上加上这些注解(@Resource、@Autowired),Spring会自动的按照Bean类型(type)或Bean名称(name)进行装配组合Bean
  @Resource:
  默认按 byName 自动注入,由J2EE提供。
   @Resource装配顺序  
   (1). 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常;  
  (2). 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常;  
  (3). 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常;  
   (4). 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;
  (5).@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入。
  @ Autowired
  注解是按类型装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它required属性为false。如果我们想使用按名称装配,可以结合@Qualifier注解(指定Bean的名称)一起使用。
(架构师之路③群:256909960,欢迎加入)
3、初始化配置
  @Configuration: 在类上加上这个注解,表明当前的类时个配置类,这个类中可能存在0个或多个@Bean
  @ComponentScan: 扫描包注解,这个注解会扫描指定的包下所有的加有@Controller;@Repository;@Component;@service注解的类,然后初始化成Bean
 
(架构师之路③群:256909960,欢迎加入)
二、context
  context上下文这个其实不算是一个注解了;这是在application.xml中启用注解的配置;
(架构师之路③群:256909960,欢迎加入)
context-component-scan
  这个注解开启了包扫描并且开启注解;此时包扫描是指定的,注解开启是全局的
(架构师之路③群:256909960,欢迎加入)
三、SpringBoot
  这里做个简单的介绍,SpringBoot的注解有很多,@Condition,@SpringBootApplication、@EnableAutoConfiguration.......其中很多都是组合注解
(架构师之路③群:256909960,欢迎加入)
1、@Conditional
  在满足条件是初始化启用
  @ConditionalOnClass (当类路径有指定class的情况)
  @ConditionalOnBean (当容器有指定bean的情况)
  @ConditionalOnJava (基于JVM版本作为判断条件)
  @ConditionalOnJndi (基于JNDI存在的条件下查找指定位置)
  @ConditionalOnMissingBean(当容器没有指定Bean的条件下)
  @ConditionalOnMissingClass(当类路径没有指定class文件的条件下)
  @ConditionalOnNotWebApplication(当前项目不是Web项目的条件下)
  @ConditionalOnProperty(指定的属性是否有指定的值)
  @ConditionalOnResource(类路径是否有指定的值)
  @ConditionalOnSingleCandidate(当指定Bean在容器只有一个,或虽然有多个但是指定首选的Bean)
  @ConditionalOnWebApplication(当前是Web项目的条件下)
  @ConditionalOnCloudPlatform(当前是云平台的条件下)
(架构师之路③群:256909960,欢迎加入)
2、SpringBootApplication
  @SpringBootApplication = (默认属性)@Configuration + @EnableAutoConfiguration + @ComponentScan。
  @Configuration:提到@Configuration就要提到他的搭档@Bean。使用这两个注解就可以创建一个简单的spring配置类,可以用来替代相应的xml配置文件。
<beans>  
    <bean id = "car" class="com.test.Car">  
        <property name="wheel" ref = "wheel"></property>  
    </bean>  
    <bean id = "wheel" class="com.test.Wheel"></bean>  
</beans> 
xml配置

相当于

@Configuration  
public class Conf {  
    @Bean  
    public Car car() {  
        Car car = new Car();  
        car.setWheel(wheel());  
        return car;  
    }  
    @Bean   
    public Wheel wheel() {  
        return new Wheel();  
    }  
}  
java代码
@Configuration的注解类标识这个类可以使用Spring IoC容器作为bean定义的来源。@Bean注解告诉Spring,一个带有@Bean的注解方法将返回一个对象,该对象应该被注册为在Spring应用程序上下文中的bean。
@EnableAutoConfiguration:能够自动配置spring的上下文,试图猜测和配置你想要的bean类,通常会自动根据你的类路径和你的bean定义自动配置。
@ComponentScan:会自动扫描指定包下的全部标有@Component的类,并注册成bean,当然包括@Component下的子注解@Service,@Repository,@Controller。
(架构师之路③群:256909960,欢迎加入)
3、EnableAutoConfiguration
  这是Spring实现自动配置的核心注解,在使用@SpringBootApplication时已经自动调用了
@SuppressWarnings("deprecation")
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {

    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

    /**
     * Exclude specific auto-configuration classes such that they will never be applied.
     * @return the classes to exclude
     */
    Class<?>[] exclude() default {};

    /**
     * Exclude specific auto-configuration class names such that they will never be
     * applied.
     * @return the class names to exclude
     * @since 1.3.0
     */
    String[] excludeName() default {};

}
源码

如何实现自动配置的呢:

spring会先找到Spring.factories,然后找到对应的配置类,这样就实现了自动配置。在后会详细说

(架构师之路③群:256909960,欢迎加入)
posted @ 2017-09-06 09:54  irich  阅读(363)  评论(0编辑  收藏  举报
(全栈工程师③群:256909960,欢迎加入)全栈工程师③群