SpringBoot常用注解的简单理解
文章目录Spring容器@Autowired@Controller@Resource@RestController@Service@Repository@Mapper@Component@Entity@Transactional@Bean@ResponseBody@RestController@RequestMapping@PathVariable@RequestParam@RequestBody
文章目录
- Spring容器
- JavaBean
- POJO
- @Autowired
- @Controller
- @Resource
- @RestController
- @Service
- @Repository
- @Mapper
- @Component
- @Entity
- @Transactional
- @Bean
- @ResponseBody
- @RestController
- @RequestMapping
- @PathVariable
- @RequestParam
- @RequestBody
- @Value
- @SpringBootApplication
- @ConfigurationProperties
- @Configuration
- @Import
- @ComponentScan
- @PostConstruct
- @PreDestroy
- @Scope
- @SessionAttributes
- @Required
- @Param
- @Configuration
- @EnableConfigurationProperties
- @EnableAutoConfiguration
- @ConfigurationProperties
其他资料参考:https://zhuanlan.zhihu.com/p/135987318
本文集各家之长而成,便于大家对SpringBoot的学习
Spring容器
一切Spring bean都存储在Spring容器内,并由其通过IoC技术管理。
一个Spring容器就是某个实现了ApplicationContext接口的类的实例。
JavaBean
Java Bean是一套模式或约定,这些约定包括getXxx、setXxx、isXxx、addXxxListener、XxxEvent等。遵守上述约定的类可以用于若干工具或库。
规范如下:
- 有一个public的无参数构造器。
- 属性可以通过get、set、is(可以替代get,用在布尔型属性上)方法或遵循特定命名规范的其他方法访问。
- 可序列化。
POJO
Plain Ordinary Java Object,通指没有使用Entity Beans的普通java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称。可以把POJO作为支持业务逻辑的协助类。
POJO实质上可以理解为简单的实体类,顾名思义POJO类的作用是方便程序员使用数据库中的数据表,对于广大的程序员,可以很方便的将POJO类当做对象来进行使用,当然也是可以方便的调用其get,set方法。
这个类没有实现/继承任何特殊的java接口或者类,不遵循任何主要java模型,约定或者框架的java对象。在理想情况下,POJO不应该有注解。
@Autowired
可以对类成员变量、方法及构造函数进行标注,将Spring容器中的bean自动地和我们需要这个bean的类装配在一起。是一个用于容器(container)配置的注解。
- 在使用@Autowired时,首先在容器中查询对应类型的bean
- 如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据
- 如果查询的结果不止一个,那么@Autowired会根据名称来查找。
- 如果查询的结果为空,那么会抛出异常。解决方法是:使用required=false
- 可以提供了一个@Qualifier(“xxx”)标记,来指定需要装配bean的名称
// 初始化时,在spring容器中寻找一个类型为UserService的bean实体注入,关联到userService
@Autowired
private UserService userService;
// UserService接口存在多个实现类,在spring注入时会报错
public class UserService1 implements UserService
public class UserService2 implements UserService
//改成以下方式:
@Autowired
private UserService userService1;
@Autowired
@Qualifier(value = "userService2")
private UserService userService3;
@Controller
控制器,注入服务。用于标注控制层,相当于struts中的action层。通常是被使用服务于web 页面。默认你的controller方法返回的是一个string 串,是表示要展示哪个模板页面或者是要跳转到哪里去。
把本类交给Spring容器管理,在Spring容器中会存在一个对应名字(类名首字母小写)的action,可指定其value修改。
标注类的方法,return时会被视图处理器识别成静态文件的路径。默认为templates文件夹下。如return "test/hello"表示的是默认路径下的test文件夹中的名叫hello的文件,带上后缀名.html或btl等也可以识别。
@Resource
这个注解属于J2EE的,默认按照名称进行装配,名称可以通过name属性进行指定。
@Resource(name="baseDao")
private BaseDao baseDao;
@RestController
专门用在编写API的时候,特别那种返回一个JSON,或者是XML等等。方法返回的可以是一个对象,或是一个可以被序列化的对象。
@Service
服务层(业务, service, manager层)。主要用来进行业务的逻辑处理。
@Repository
持久层(DAO层)。实现dao访问。用于标注数据访问层,也可以说用于标注数据访问组件,即DAO组件。DAO直接负责数据库的存取工作。
Repository居于业务层和数据层之间,将两者隔离开来,在它的内部封装了数据查询和存储的逻辑。
当你的一个类被@Component所注解,那么就意味着同样可以用@Repository, @Service, @Controller来替代它,同时这些注解会具备有更多的功能,而且功能各异。
如果你不知道要在项目的业务层采用@Service还是@Component注解。那么,@Service是一个更好的选择。
@Repository(value=“userDao”)注解是告诉Spring,让Spring创建一个名字叫“userDao”的UserDaoImpl实例。
当Service需要使用Spring创建的名字叫“userDao”的UserDaoImpl实例时,就可以使用@Resource(name = “userDao”)注解告诉Spring,Spring把创建好的userDao注入给Service即可。
@Mapper
与@Repository功能一样,且都是注解在DAO上。
@Repository需要在Spring中配置扫描地址,然后生成Dao层的Bean才能被注入到Service层中。
@Mapper不需要配置扫描地址,通过xml里面的namespace里面的接口地址,生成了Bean后注入到Service层中。
给mapper接口自动生成一个实现类,让spring对mapper接口的bean进行管理,并且可以省略去写复杂的xml文件(也可以写)。
@Component
把普通pojo实例化到spring容器中。泛指各种组件,就是说当我们的类不属于各种归类的时候(不属于@Controller、@Services等的时候),我们就可以使用@Component来标注这个类。在你确定不了是哪一个层的时候使用。
把普通pojo实例化到spring容器中,相当于配置文件中的
被注解的这个类是从Spring容器中取出来的,那调用的实现类也需要被Spring容器管理,加上@Component。
@Component用于我们的类,它只有在我们的SpringBoot应用程序启用了组件扫描并且包含了我们的类时才有效。
通过组件扫描,Spring将扫描整个类路径,并将所有@Component注释类添加到Spring Context(具有可调整的Filtering)。
让Spring发现了bean。
@Entity
对实体类注释。任何Hibernate映射对象都要有这个注释。
必须与‘主键@Id’注解结合使用,通常和‘数据表名@Table’结合使用。
实体类主要是作为数据管理和业务逻辑处理层面上存在的类别。他们的主要目的是存储数据并提供对这些数据的访问。 在很多情况下,实体类是持久的。
@Transactional
开启事务,在service层添加事务是非常有必要的。
先在 xml 中配置事务信息;再将@Transactional 注解添加到合适的方法上,并设置合适的属性信息。
@Bean
@Bean与配置类(使用@Configuration)一起工作,因此使用在基于配置中。也可用在配置类的方法中。告诉Spring将方法返回的任何内容添加到Spring Context中。
默认情况下,它将使用方法的名称作为bean的id / name(类似XML配置:bean id=xxxx)。另一种方法是,您可以在@Bean注释中指定它。
产生这个Bean对象的方法Spring只会调用一次,随后这个Spring将会将这个Bean对象放在自己的IOC容器中。
明确声明了bean。SpringIOC 容器管理一个或者多个bean,这些bean都需要在@Configuration注解下进行创建,在一个方法上使用@Bean注解就表明这个方法需要交给Spring进行管理。
@Configuration
public class AppConfig {
// 使用@Bean 注解表明myBean需要交给Spring进行管理
// 未指定bean 的名称,默认采用的是 "方法名" + "首字母小写"的配置方式
@Bean
public MyBean myBean(){
return new MyBean();
}
}
public class MyBean {
public MyBean(){
System.out.println("MyBean Initializing");
}
}
@ResponseBody
可以标注方法也可以标注类。
当标注方法时表示该方法的返回值会被解析成json,直接写入HTTP Response Body中,视图处理器将不会把return的参数识别成路径。
当它标注类时,类中所有方法的返回值都将直接返回值到页面,相当于给类中所有的方法都加上@ResponseBody注解。
@RestController
是@Controller和@ResponseBody的结合体,只能注解类,return返回的值将被转换成json,字符串除外,直接写入HTTP相应体返回到页面中。
@RequestMapping
可以注解类也可以注解方法,注解类时标注请求的路径,标注方法时表示将特定的URL映射到指定的方法。
类似的还有@GetMapping、@PostMapping、@PutMapping、@PatchMapping、@DeleteMapping
@PathVariable
参数注解。
用于获取URL中的参数:一般{ }中的变量名与方法中的形参名一致(可以不加@PathVariable注解);
@RequestMapping(value = "/test/{name}" ,method = RequestMethod.GET)
public String Hello(@PathVariable String name) {
System.out.println(name);
return "/index.html";
如果名称不一致则写成:(否则不单单是获取不到参数,连方法都不执行!)
@RequestMapping(value = "/test/{name}" ,method = RequestMethod.GET)
public String Hello(@PathVariable("name")String userName) {
System.out.println(userName);
return "/index.html";
@RequestParam
用来处理Content-Type为application/x-www-form-urlencoded(默认类型如果不指定),使用value属性可以指定获取参数的key。
// 变量名和查询字符参数一样
// GET /users?count=10
@GetMapping("/users")
public List<User> index(@RequestParam int count) {...}
// 变量名和查询字符参数不一样
// GET /users?num_per_page=50
public List<User> index(@RequestParam("num_per_page") int numPerPage) {...}
@RequestBody
一般用来处理非Content-Type: application/x-www-form-urlencoded编码格式的数据,在GET请求中没有请求体所以一般不适用,在post请求中必须指定Content-Type后才能使用它,如ajax请求指定发送格式为application/json。
// 捕获前端发送过来的JSON串
@PostMapping
public User create(@RequestBody UserCreateRequest request) {...}
@Value
@Value(“#{}”) 表示SpEl表达式通常用来获取bean的属性,或者调用bean的某个方法。当然还有可以表示常量
@Value("#{1}")
private int number; //获取数字 1
@Value("#{'Spring Expression Language'}") //获取字符串常量
private String str;
@Value("normal")
private String normal; // 注入普通字符串
@Value("#{systemProperties['os.name']}")
private String systemPropertiesName; // 注入操作系统属性
@Value("#{dataSource.url}") //获取bean的属性
private String jdbcUrl;
@Value("#{ T(java.lang.Math).random() * 100.0 }")
private double randomNumber; //注入表达式结果
@Value("classpath:com/hry/spring/configinject/config.txt")
private Resource resourceFile; // 注入文件资源
@Value(“${xxxx}”)注解从yml或properties或自定义属性文件中读取配置。自定义属性文件通过@PropertySource加载。
@Value("${init.password}")
private String initPwd;
@SpringBootApplication
@ComponentScan+@Configuration+@EnableAutoConfiguration
@ConfigurationProperties
将外部配置文件(比如test.properties/test.yml)加载进来,填充对象的对应字段的数据,然后供其他Bean使用。
@ConfigurationProperties 和 @value 有着相同的功能,但是 @ConfigurationProperties的写法更为方便
test.yml:
environment:
production:
url: http://production.example.com
name: production mode
dev:
url: http://dev.example.com
name: developer mode
@Configuration //配置类注解,被自动扫描发现
@PropertySource("test.yml") //指明配置源文件位置
@ConfigurationProperties(prefix = "environment") //指明前缀
@Configuration
用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。
@Configuration的第二个作用是可以作为配置类,和@Component的作用一样,两者的差别是@Configuration 中所有带 @Bean 注解的方法都会被动态代理,因此调用该方法返回的都是同一个实例。
@Configuration标注在类上,相当于把该类作为spring的xml配置文件中的,作用为:配置spring容器(应用上下文)
使用@Configuration注解一个类表明该类可以被Spring IoC容器用作bean定义的来源。该@Bean注解告诉Spring与@Bean注释的方法将返回应注册为Spring应用程序上下文的bean的对象。最简单的@Configuration类可能如下:
@Configuration
public class HelloWorldConfig {
@Bean // 方法名用@Bean作为bean ID进行注释,并创建并返回实际的bean
public HelloWorld helloWorld(){
return new HelloWorld();
}
}
以上代码将等同于以下XML配置:
<beans>
<bean id = "helloWorld" class = "com.breakyizhan.HelloWorld" />
</beans>
@Import
允许从另一个配置类加载@Bean定义。
@Configuration
public class ConfigA {
@Bean
public A a() {
return new A();
}
}
@Configuration
@Import(ConfigA.class)
public class ConfigB {
@Bean
public B a() {
return new A();
}
}
现在,在实例化上下文时,不需要同时指定ConfigA.class和ConfigB.class,只需要按如下方式提供ConfigB:
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(ConfigB.class);
// now both beans A and B will be available...
A a = ctx.getBean(A.class);
B b = ctx.getBean(B.class);
}
@ComponentScan
注解在类上,扫描标注了@Controller等注解的类,注册为bean 。
@ComponentScan 为 @Configuration注解的类配置组件扫描指令。
@ComponentScan 注解会自动扫描指定包下的全部标有 @Component注解的类,并注册成bean,当然包括 @Component下的子注解@Service、@Repository、@Controller。
// 扫描路径
@ComponentScan(value = "spring.annotation.componentscan")
// 指定扫描类
@ComponentScan(basePackageClasses = {BookDao.class, BookService.class})
@PostConstruct
用来标记是在项目启动的时候执行这个方法。用来修饰一个非静态的void()方法也就是spring容器启动时就执行,多用于一些全局配置、数据字典之类的加载被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。
PostConstruct在构造函数之后执行,init(方法之前执行。PreDestroy ()方法在destroy(方法执行执行之后执
@PreDestroy
被@PreDestroy修饰的方法会在服务器卸载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的destroy()方法。被@PreDestroy修饰的方法会在destroy(方法之后运行,在Servlet被彻底卸载之前。
@Scope
用来配置spring bean的作用域,它标识bean的作用域。默认值是单例
- singleton: 单例模式,全局有且仅有一个实例
- prototype: 原型模式,每次获取Bean的时候会有一个新的实例
- request: 表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTPrequest内有效
- session: 该作用域表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效
- global session: 只在portal应用中有用,给每一个global http session新建一个Bean实例。
@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";
}
}
@Required
适用于bean属性setter方法,并表示受影响的bean属性必须在XML配置文件在配置时进行填充。否则,容器会抛出一个BeanInitializationException异常。
@Param
@Param是MyBatis所提供的,作为Mapper层的注解,作用是用于传递参数,从而可以与SQL中的的字段名相对应,一般在 2=<参数数<=5 时使用最佳。
public List<User> findUser(@Param("name1") String name1, @Param("name2") String name2);
// 对应的SQL文件:
<select id="findUser" resultType="com.tx.springboottestdemo.entity.User">
select * from user_test where userName = #{name1} and realName = #{name2}
</select>
@Configuration
用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean
注解的方法,这些方法将会被AnnotationConfigApplicationContext
或AnnotationConfigWebApplicationContext
类进行扫描,并用于构建bean
定义,初始化Spring容器。
@EnableConfigurationProperties
使得使用 @ConfigurationProperties
注解的类生效,相当于进行了一次注入。
当@EnableConfigurationProperties
注解应用到你的@Configuration
时, 任何被@ConfigurationProperties
注解的beans
将自动被Environment属性配置。 这种风格的配置特别适合与SpringApplication
的外部YAML
配置进行配合使用。
如下:JdbcProperties.java
自动从application.properties
获取了参数,JdbcConfig.java
中使用了JdbcProperties.java
中的方法。
JdbcConfig.java
@Configuration
@EnableConfigurationProperties(JdbcProperties.class)
public class JdbcConfig {
@Bean
public DataSource getDataSource(JdbcProperties jdbcProperties) {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(jdbcProperties.getDriver());
dataSource.setUrl(jdbcProperties.getUrl());
dataSource.setUsername(jdbcProperties.getUsername());
dataSource.setPassword(jdbcProperties.getPassword());
return dataSource;
}
}
JdbcProperties.java
// 前缀为jdbc
@ConfigurationProperties(prefix = "jdbc")
public class JdbcProperties {
private String driver;
private String url;
private String username;
private String password;
// getter and setter method
}
application.properties
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=1061700625
@EnableAutoConfiguration
启用Spring应用程序上下文的自动配置,尝试猜测和配置您可能需要的bean。自动配置类通常基于类路径和定义的bean应用。
@ConfigurationProperties
用于读取配置文件的信息,在这里是读取配置在yml里的redis的相关配置项。
@RunWith
@RunWith
是一个运行器,告诉junit的框架应该是使用哪个testRunner。可以直接使用spring容器,直接使用@Test注解,不用启动spring容器@RunWith(JUnit4.class)
是指用JUnit4来运行@RunWith(SpringJUnit4ClassRunner.class)
,让测试运行于Spring测试环境,以便在测试开始的时候自动创建Spring的应用上下文@RunWith(Suite.class)
是一套测试集合@ContextConfiguration
是Spring整合JUnit4测试时,使用注解引入多个配置文件SpringRunner
继承了SpringJUnit4ClassRunner
,没有扩展任何功能;使用前者,名字简短而已- 当导入了
spring-test
依赖,@RunWith
就不会出现SpringRunner
,反而有@RunWith(SpringJUnit4ClassRunner.class)
更多推荐
所有评论(0)