最近想整理一波Spring注解相关的文章,虽然写CURD就只涉及到那些经常使用的注解。可是笔者我也想去了解一下其余注解,丰富下本身的知识面(提高一下逼格!)。 就想在网上搜了半天,好像你们的都差很少,也找不到原文出处了。这里我就在此基础上结合相关知识点作一下整理。以便本身或者你们参考查阅了~html
@Controller:标注一个控制器组件类。标识一个该类是Spring MVC controller处理器,用来建立处理http请求的对象。组合注解(组合了@Component注解),应用在MVC层(控制层)java
@Controller
public class TestController {
@RequestMapping("/test")
public String test(String name){
return "hello";
}
}
复制代码
Spring4
以后加入的注解,原来在@Controller
中返回json
须要@ResponseBody
来配合,若是直接用@RestController
替代@Controller
就不须要再配置@ResponseBody
,默认返回json格式。git
@RestController
public class TestController {
@RequestMapping("/test")
public String test(String name){
return "hello";
}
}
复制代码
@Service 把类当作容器中的一个组件来使用。 当使用@Autowired注解则是实例化构造器。由于在自动注入时,是一个接口类型,因此要在容器中找到相应的实现类注入。故@Service加到类上。组合注解(组合了@Component注解),应用在service层(业务逻辑)。github
@Service
public interface UserService {
User login(String username,String password);
}
//当把注解写在接口上时,spring容器会注入失败。
//注解写在类上 注入不会失败。
@Service
public class UserServiceImpl implements UserService{
@Autowired
private UserMapper userMapper;
}
@Controller
@RequestMapping("user")
public class UserController {
@Autowired
private UserService userService
}
复制代码
@Repository注解便属于最早引入的一批,它用于将数据访问层 (DAO 层 ) 的类标识为 Spring Bean。具体只需将该注解标注在 DAO类上便可。为何 @Repository 只能标注在 DAO 类上呢?这是由于该注解的做用不仅是将类识别为Bean,同时它还能将所标注的类中抛出的数据访问异常封装为 Spring 的数据访问异常类型。 Spring自己提供了一个丰富的而且是与具体的数据访问技术无关的数据访问异常结构,用于封装不一样的持久层框架抛出的异常,使得异常独立于底层的框架。组合注解(组合了@Component注解),应用在DAO层(数据访问层)。面试
把普通pojo实例化到spring容器中,至关于配置文件中的,表示一个带注释的类的一个"组件",成为Spring管理的Bean。当使用基于注解的配置和类路径扫描时,这些类被视为自动检测的候选对象。同时@Component仍是一个元注解。算法
@Configuration做用在类上,声明一个class须要被spring解析以扩充beanDefinition。 @Configration注解同时被@Component注解修饰,所以具备被自动加载的特色,被@Configuration修饰的类自己也会做为definition注册。value属性是Configuration bean名称。spring
这个注解属于J2EE的。@Resource
的做用至关于@Autowired
,只不过@Autowired
按byType
自动注入,而@Resource
默认按 byName
自动注入罢了。@Resource
有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。因此若是使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。若是既不指定name也不指定type属性,这时将经过反射机制使用byName自动注入策略。编程
@Resource装配顺序json
Spring的@Bean注解用于告诉方法,产生一个Bean对象,而后这个Bean对象交给Spring管理。产生这个Bean对象的方法Spring只会调用一次,随后这个Spring将会将这个Bean对象放在本身的IOC容器中。 SpringIOC 容器管理一个或者多个bean,这些bean都须要在@Configuration注解下进行建立,在一个方法上使用@Bean注解就代表这个方法须要交给Spring进行管理。安全
详细了解@Bean 注解全解析:www.cnblogs.com/cxuanBlog/p…
值得注入。常常与Spring EL表达式语言一块儿使用,注入普通字符,系统属性,表达式运算结果,其余Bean的属性,文件内容,网址请求内容,配置文件属性值等等。 主要两种使用方法:
指定文件地址。提供一种方便的、声明性的机制,用于向Spring环境添加PropertySource。与@Configuration类一块儿使用。在app项目中,咱们经过@PropertySource注解到JavaConfig类上,设置.properties配置文件的路径。
@Component
@PropertySource(value = "application.properties")
public class Message {
@Value("${demo.msg}")
private String msg;
}
复制代码
@ResponseBody
注解表示该方法的返回的结果直接写入HTTP响应正文中(ResponseBody),通常在异步获取数据时使用,一般是在使用@RequestMapping
后。返回值一般解析为跳转路径,加上@ResponseBody
后返回结果不会被解析为跳转路径,而是直接写入HTTP
响应正文中。
使用 @RequestMapping
来映射 Request
请求与处理器,经过这个注解能够定义不一样的处理器映射规则,即为控制器指定能够处理哪些URL请求。
用@RequestMapping
来映射URL
到控制器类,或者是到Controller
控制器的处理方法上。 当@RequestMapping
标记在Controller
类上的时候,里面使用@RequestMapping
标记的方法的请求地址都是相对于类上的@RequestMapping 而言的; 当Controller
类上没有标记@RequestMapping
注解时,方法上的@RequestMapping
都是绝对路径。这种绝对路径和相对路径所组合成的最终路径都是相对于根路径“/ ”而言的。
@SpringBootApplication
是一个组合注解 源码以下:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {
@Filter(type = FilterType.CUSTOM,classes = {TypeExcludeFilter.class}),
@Filter( type = FilterType.CUSTOM,classes = {AutoConfigurationExcludeFilter.class})
}
)
public @interface SpringBootApplication {
}
复制代码
由源码可知,主要包含三个注解@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan。
@ComponentScan
(包扫描)component是组件,scan是扫描,因此这个注解的含义就是用来扫描组件的
ComponentScan就是扫描所标注的类所在包下的全部须要注入的组件,将其注入,这里他是在@SpringBootApplication 中体现的,因此这个注解会自动注入全部在主程序所在包下的组件
之前在ssm项目中咱们须要去配置咱们的包扫描,相对应的XML配置就是context:component-scan/, 将符合条件的组件加入到IOC容器中。
详细了解点击:blog.csdn.net/luojinbai/a…
@EnableAutoConfiguration
表示开启自动装配,注解主要做用从classpath中搜寻全部的META-INF/spring.factories配置文件,并将其中的org.spring-framework.boot.autoconfigure.EnableAutoConfiguration对应的配置项经过反射实例化为对应的标注了@Configuration的javaConfig形式的IOC容器配置类,而后汇总为一整个并加载到IOC容器。
源码以下:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
Class<?>[] exclude() default {};
String[] excludeName() default {};
}
复制代码
其中两个比较重要的注解@AutoConfigurationPackage
与@Import({AutoConfigurationImportSelector.class})
@AutoConfigurationPackage
表示获取咱们注解所在包下的组件去进行注册@Import({AutoConfigurationImportSelector.class})
表示自动配置导入选择器,从META-INF/spring.factories获取咱们的自动配置信息的将properties属性与一个Bean及其属性相关联,从而实现类型安全的配置。例如:@ConfigurationProperties(prefix="connection")
@Data// lombok注解,相关知识能够自行查阅
@Component
@ConfigurationProperties(prefix="connection")
public class ConnectionSettings {
private String username;
private String remoteAddress;
private String password ;
}
复制代码
详细内容可参考:blog.csdn.net/fcvtb/artic…
@ConditionalOnBean
与@ConditionalOnMissingBean
两个注解都是条件注解,做用相反。
@ConditionalOnBean
表示存当给定的在bean存在时,则实例化当前Bean。@ConditionalOnMissingBean
表示当给定的在bean不存在时,则实例化当前Bean。@ConditionalOnBean:
结合使用注解@ConditionalOnBean
和@Bean
,能够作到只有特定名称或者类型的Bean
存在于BeanFactory
时才建立某个Bean。例如:
@Configuration
public class ConditionalOnBeanConfig {
@Bean
public A beanA(){
return new A(); // 建立一个Bean,名称是 beanA,不须要知足什么前置条件,
}
@Bean
@ConditionalOnBean(name="beanA")
public B beanB(){
// 仅在beanFactory存在一个名称叫作beanA的bean时,当前方法初始化一个名字为beanB的bean。
return new B();
}
@Bean
@ConditionalOnBean
public C beanC(){
//若是beanFactory不存在一个类型为C的bean,则不建立该bean。
// 若是当前项目仅有这一个 bean 配置文件,则由于 beanFactory 中不存在一个类型为C的 bean ,因此当前
// 方法定义的名称为 beanC 的 bean 并不会被初始化。
return new C();
}
@Bean
public SimpleInt beanAInt(){
// 建立一个类型为 SimpleInt 的 bean ,其实现类使用 ASimpleInt
return new ASimpleInt();
}
@Bean
@ConditionalOnBean
public SimpleInt beanBInt(){
// 仅在 beanFactory 中存在一个类型为 SimpleInt 的 bean 时才初始化一个类型一样 为 SimpleInt
// 的 bean ,bean 名称为 beanBInt
return new BSimpleInt();
}
}
复制代码
@ConditionalOnMissingBean
配置类中有两个Computer类的bean,一个是笔记本电脑,一个是备用电脑。若是当前容器中已经有电脑bean了,就不注入备用电脑,若是没有,则注入备用电脑,这里须要使用到@ConditionalOnMissingBean。
@Configuration
public class BeanConfig {
@Bean(name = "notebookPC")
public Computer computer1(){
return new Computer("笔记本电脑");
}
@ConditionalOnMissingBean(Computer.class)
@Bean("reservePC")
public Computer computer2(){
return new Computer("备用电脑");
}
}
复制代码
@ConditionalOnClass
与@ConditionalOnMissingClass
这两个注解与@ConditionalOnBean与@ConditionalOnMissingBean两个注解类似。
@ConditionalOnSingleCandidate : DI容器中该类型Bean只有一个或@Primary的只有一个时起效 @ConditionalOnExpression : SpEL表达式结果为true时 @ConditionalOnProperty : 参数设置或者值一致时起效 @ConditionalOnResource : 指定的文件存在时起效 @ConditionalOnJndi : 指定的JNDI存在时起效 @ConditionalOnJava : 指定的Java版本存在时起效 @ConditionalOnWebApplication : Web应用环境下起效 @ConditionalOnNotWebApplication : 非Web应用环境下起效
以上注解都是条件注解,做用相似。这里就不作过多介绍了~~ 有兴趣的朋友可自行查阅官网:spring.io/
大厂笔试内容集合(内有详细解析) 持续更新中....
欢迎关注我的微信公众号:Coder编程 欢迎关注Coder编程公众号,主要分享数据结构与算法、Java相关知识体系、框架知识及原理、Spring全家桶、微服务项目实战、DevOps实践之路、每日一篇互联网大厂面试或笔试题以及PMP项目管理知识等。更多精彩内容正在路上~ 偶尔分享一些杂文~ 文章收录至 Github: github.com/CoderMerlin… Gitee: gitee.com/573059382/c… 欢迎关注并star~
![]()