一、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>
相当于
@Configuration public class Conf { @Bean public Car car() { Car car = new Car(); car.setWheel(wheel()); return car; } @Bean public Wheel wheel() { return new Wheel(); } }
@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,欢迎加入)