目录
扫描二维码关注公众号,回复: 10200847 查看本文章
1. 注解是什么?
其实 Java 的注解还是特别常见的,像平时用到的 @Override、@Deprecated 等都是注解的一种表现方式。
对于注解官方解释:为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后的某个时刻非常方便地使用这些数据。
2. 注解作用
可以书写更加干净易读的代码,简化重复的工作,比如 Spring 的注解;
另外还提供编译期类型检查,比如外汇返佣@Override 当方法签名对不上覆盖的方法时,编译器就会发出错误提示。
3. 注解分类
- 注解名字
- 注解类型
- 注解作用
还有JDK本身提供的标准注解:
- @Override
表示当前的方法覆盖自父类方法。如果不小心拼写错误或者方法签名对不上,编译器就会报错 - @Deprecated
表示此方法已经失效,将在未来版本中删除 - @SuppressWarnings
关闭编译器的警告信息 - @Target
元注解,表示该注解用于什么地方。CONSTRUCTOR:构造器声明 FIELD:域声明(包括enum实例) LOCAL_VARIABLE:局部变量声明 METHOD:方法声明 PACKAGE:包声明 PARAMETER:参数声明 TYPE:类、接口(包括注解类)或者enum声明
4.Spring注解
spring中使用注解时配置文件的写法:
<?xml version="1.0" encoding="UTF-8"?>
<span style="font-size:18px;"><beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">
<!--上面的内容是固定的-->
<!--下面这两行就是开启扫描注解,第一行是开启扫描注解,第二行是要扫描的包位置。但是最新的Spring版本中,第一行命令合并到第二行命令中 了,也就是说可以直接写第二行-->
<context:annotation-config/>
<context:component-scan base-package="com.test" />
</beans>
配置项就配置了对指定的包进行扫描,以实现依赖注入。
4.1、声明bean的注解
@Component 组件,没有明确的角色
@Service 在业务逻辑层使用(service层)
@Repository 在数据访问层使用(dao层)
@Controller 在展现层使用,控制器的声明(C)
这里需要注意,虽然暂时Service,Repository,Conreller只是单纯的表示bean的所在层,并没有其他的作用,但是Spring官方文档中说过,以后这些注解会有自己特有的功能,所以以后尽量避免使用Component通用注解。
4.2、注入bean的注解
@Autowired:由Spring提供,注入bean
@Inject:由JSR-330提供
@Resource:由JSR-250提供
都可以注解在set方法和属性上,推荐注解在属性上
4.3、java配置类相关注解
@Configuration 声明当前类为配置类,相当于xml形式的Spring配置(类上),配置spring的方式有三种,这个就是第三种javaconfig。
@Bean 注解在方法上,声明当前方法的返回值为一个bean,替代xml中的方式(方法上)
@Configuration 声明当前类为配置类,其中内部组合了@Component注解,表明这个类是一个bean(类上)
@ComponentScan("") 用于对Component进行扫描,括号里面写路径,相当于xml中的<context:component-scan base-package="com.test" />(类上)
@WishlyConfiguration 为@Configuration与@ComponentScan的组合注解,可以替代这两个注解
4.4、切面(AOP)相关注解
Spring支持AspectJ的注解式切面编程。
@Aspect 声明一个切面(类上)使用@After、@Before、@Around定义建言(advice),可直接将拦截规则(切点)作为参数。
@After 在方法执行之后执行(方法上)
@Before 在方法执行之前执行(方法上)
@Around 在方法执行之前与之后执行(方法上)
@PointCut 声明切点
在java配置类中使用@EnableAspectJAutoProxy注解开启Spring对AspectJ代理的支持(类上)
@Bean的属性支持
@Scope 设置Spring容器如何新建Bean实例(方法上,得有@Bean)
4.5、其设置类型包括
Singleton (单例,一个Spring容器中只有一个bean实例,默认模式),
Protetype (每次调用新建一个bean),
Request (web项目中,给每个http request新建一个bean),
Session (web项目中,给每个http session新建一个bean),
GlobalSession(给每一个 global http session新建一个Bean实例)
@StepScope 在Spring Batch中还有涉及
@PostConstruct 由JSR-250提供,在构造函数执行完之后执行,等价于xml配置文件中bean的initMethod
@PreDestory 由JSR-250提供,在Bean销毁之前执行,等价于xml配置文件中bean的destroyMethod
4.6、@Value注解
@Value 为属性注入值(属性上)
支持如下方式的注入:
//注入普通字符串
@Value("Michael Jackson")
String name;
//注入操作系统属性
@Value("#{systemProperties['os.name']}")
String osName;
//注入表达式结果
@Value("#{ T(java.lang.Math).random() * 100 }")
String rNum;
//注入其他bean属性
@Value("#{domClass.name}")
String name;
//注入文件资源
@Value("classpath:com/hgs/hello/test.txt")
Resource file
//注入网站资源
@Value("http://www.baidu.com")
Resource url;
//注入配置文件
@Value("${bo.name}")
String boName
注入配置使用方法:
① 编写配置文件(test.properties)
book.name=活着
@PropertySource 加载配置文件(类上)
@PropertySource("classpath/com/xxx/test.properties")
还需配置一个PropertySourcesPlaceholderConfigurer的bean。
4.7、环境切换
@Profile 通过设定Environment的ActiveProfiles来设定当前context需要使用的配置环境。(类或方法上)
@Conditional Spring4中可以使用此注解定义条件话的bean,通过实现Condition接口,并重写matches方法,从而决定该bean是否被实例化。(方法上)
4.8、异步相关
@EnableAsync 配置类中,通过此注解开启对异步任务的支持,叙事性AsyncConfigurer接口(类上)
@Async 在实际执行的bean方法使用该注解来申明其是一个异步任务(方法上或类上所有的方法都将异步,需要@EnableAsync开启异步任务)
4.9、定时任务相关
@EnableScheduling 在配置类上使用,开启计划任务的支持(类上)
@Scheduled 来申明这是一个任务,包括cron,fixDelay,fixRate等类型(方法上,需先开启计划任务的支持)
4.10、@Enable*注解说明
这些注解主要用来开启对xxx的支持。
@EnableAspectJAutoProxy 开启对AspectJ自动代理的支持
@EnableAsync 开启异步方法的支持
@EnableScheduling 开启计划任务的支持
@EnableWebMvc 开启Web MVC的配置支持
@EnableConfigurationProperties 开启对@ConfigurationProperties注解配置Bean的支持
@EnableJpaRepositories 开启对SpringData JPA Repository的支持
@EnableTransactionManagement 开启注解式事务的支持
@EnableTransactionManagement 开启注解式事务的支持
@EnableCaching 开启注解式的缓存支持
4.11、测试相关注解
@RunWith 运行器,Spring中通常用于对JUnit的支持
@RunWith(SpringJunit4ClassRunner.class)
@ContextConfiguration 用来加载配置ApplicationContext,其中classes属性用来加载配置类
@ContextConfiguration(classes={TestCofig.class})
5、SpringMVC的注解
@EnableWebMvc 在配置类中开启Web MVC的配置支持,如一些ViewResolver或者MessageConverter等,若无此句,重写WebMvcConfigurerAdapter方法(用于对SpringMVC的配置)。
@Controller 声明该类为SpringMVC中的Controller
@RequestMapping 用于映射Web请求,包括访问路径和参数(类或方法上)
@ResponseBody 支持将返回值放在response内,而不是一个页面,通常用户返回json数据(返回值旁或方法上)
@RequestBody 允许request的参数在request体中,而不是在直接连接在地址后面。(放在参数前)
@PathVariable 用于接收路径参数,比如@RequestMapping(“/hello/{name}”)申明的路径,将注解放在参数中前,即可获取该值,通常作为Restful的接口实现方法。
@RestController 该注解为一个组合注解,相当于@Controller和@ResponseBody的组合,注解在类上,意味着,该Controller的所有方法都默认加上了@ResponseBody。
@ControllerAdvice 通过该注解,我们可以将对于控制器的全局配置放置在同一个位置,注解了@Controller的类的方法可使用@ExceptionHandler、@InitBinder、@ModelAttribute注解到方法上,这对所有注解了 @RequestMapping的控制器内的方法有效。
@ExceptionHandler 用于全局处理控制器里的异常
@InitBinder 用来设置WebDataBinder,WebDataBinder用来自动绑定前台请求参数到Model中。
@ModelAttribute 本来的作用是绑定键值对到Model里,在@ControllerAdvice中是让全局的@RequestMapping都能获得在此处设置的键值对。
@Required 适用于bean属性setter方法,并表示受影响的bean属性必须在XML配置文件在配置时进行填充。否则,容器会抛出一个BeanInitializationException异常。
@SessionAttributes 默认情况下Spring MVC将模型中的数据存储到request域中。当一个请求结束后,数据就失效了。如果要跨页面使用。那么需要使用到session。而@SessionAttributes注解就可以使得模型中的数据存储一份到session域中
参数:
- names:这是一个字符串数组。里面应写需要存储到session中数据的名称。
- types:根据指定参数的类型,将模型中对应类型的参数存储到session中
- value:和names是一样的。
样例代码:
@Controller
@SessionAttributes(value={"names"},types={Integer.class})
public class ScopeService {
@RequestMapping("/testSession")
public String test(Map<String,Object> map){
map.put("names", Arrays.asList("a","b","c"));
map.put("age", 12);
return "hello";
}
}
常用的注解详细解释:
@Controller
SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的View 进行展示。在SpringMVC 中提供了一个非常简便的定义Controller 的方法,你无需继承特定的类或实现特定的接口,只需使用@Controller 标记一个类是Controller ,然后使用@RequestMapping 和@RequestParam 等一些注解用以定义URL 请求和Controller 方法之间的映射,这样的Controller 就能被外界访问到。
@Service
服务层组件,用于标注业务层组件,表示定义一个bean(实体类),自动根据bean的类名实例化一个首写字母为小写的bean,例如Chinese实例化为chinese,如果需要自己改名字则:@Service("你自己改的bean名")。
@Repository
它用于将数据访问层 (DAO 层 ) 的类标识为 Spring Bean。具体只需将该注解标注在 DAO类上即可。
为什么 @Repository 只能标注在 DAO 类上呢?这是因为该注解的作用不只是将类识别为Bean,同时它还能将所标注的类中抛出的数据访问异常封装为 Spring 的数据访问异常类型。 Spring本身提供了一个丰富的并且是与具体的数据访问技术无关的数据访问异常结构,用于封装不同的持久层框架抛出的异常,使得异常独立于底层的框架。
@RequestMapping
RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
@Autowired
@Autowired 注释,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。
@ResponseBody
@ResponseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后(@ResponseBody的作用其实是将java对象转为json格式的数据。),写入到response对象的body区,通常用来返回JSON数据或者是XML数据,需要注意的呢,在使用此注解之后不会再走试图处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。
@MapperScan
作用:指定要变成实现类的接口所在的包,然后包下面的所有接口在编译之后都会生成相应的实现类
添加位置:是在Springboot启动类上面添加。
@SpringBootApplication
启动类注解(一般在root下):
该注解被@Configuration、@EnableAutoConfiguration、@ComponentScan 这三个注解所修饰
1、@SpringBootConfiguration继承自@Configuration,二者功能也一致,标注当前类是配置类,并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到spring容器中,并且实例名就是方法名。
2、@EnableAutoConfiguration:是spring boot的核心功能,自动配置。这个注释告诉SpringBoot“猜”你将如何想配置Spring,基于你已经添加jar依赖项。如果spring-boot-starter-web已经添加Tomcat和Spring MVC,这个注释自动将假设您正在开发一个web应用程序并添加相应的spring设置.
通常推荐将 @EnableAutoConfiguration 配置在 root 包下,这样所有的子包、类都可以被查找到。
3、@ComponentScan
通俗的讲,@ComponentScan 注解会自动扫描指定包下的全部标有 @Component注解 的类,并注册成bean,当然包括 @Component 下的子注解@Service、@Repository、@Controller。@ComponentScan 注解没有类似的属性。
@requestParam
@requestParam主要用于在SpringMVC后台控制层获取参数,类似一种是request.getParameter("name"),它有三个常用参数:defaultValue = "0", required = false, value = "isApp";defaultValue 表示设置默认值,required 通过boolean设置是否是必须要传入的参数,value 值表示接受的传入的参数类型。
@Scope
用来配置 spring bean 的作用域,它标识 bean 的作用域。
默认值是单例
- singleton:单例模式,全局有且仅有一个实例
- prototype:原型模式,每次获取Bean的时候会有一个新的实例
- request:request表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效
- session:session作用域表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效
- global session:只在portal应用中有用,给每一个 global http session 新建一个Bean实例。
@RestController
Spring4之后加入的注解,原来在@Controller中返回json需要@ResponseBody来配合,如果直接用@RestController替代@Controller就不需要再配置@ResponseBody,默认返回json格式。
样例代码:
@RestController
public class TestController {
@RequestMapping("/test")
public String test(Map<String,Object> map){
return "hello";
}
}
1、@Autowired @Qualifier 与 @Resource
用法:标注在成员变量上,或者set方法上。@Autowired 与 @Resource 都是用于bean自动装配的。(确切的说@Resource是jdk自带的注解);
区别:@Autowired装配默认是通过类型去查找,也可以通过@Qualifier指定名称查找。而@Resource 默认按照名称进行查找,当然也可指定类型、指定名称或者同时指定。指定类型的时候如果找不到或者找到多个都会抛出异常。同时指定类型和名称的时候,会去找唯一匹配的bean,如果找到多个抛出异常。
例:
/*
*接口
*/
public interface PersonService{
public void eat();
public void play();
}
/*
*接口实现类
*/
@Service("personService")
public class PersonServiceImpl implements PersonService{
@Override
public void eat(){
System.out.println("eat");
}
@Override
public void play(){
System.out.println("play");
}
}
/*
*调用类
*/
public class Demo{
@Resource
private PersonService personService;
@Autowired
private PersonService personService2;
@Autowired
@Qualifier("personService")
private PersonService personService3;
public void test(){
personService.eat();
personService2.eat();
}
}
2、@Service @Component @Controller @Repository
用法:都是标注在类名上,用于注册一个bean到Spring上下文中。
区别:@Service 用于服务层;@Controller用于控制层;@Repository用于DAO层;不确定的用@Component
例:见示例代码一(同Service的用法)
3、@RequestMapping @RequestParam
用法:@RequestMapping标注在控制层类上面映射一个请求路径;@RequestParam 映射一个请求参数;
例:
/*
*控制层类
*/
@Controller
@RequestMapping("/register")
public class RegisterUser{
public void register(@RequestParam("ownerId") int ownerId){
//dosomething
}
}