SpringBoot常用注解
Configuration注解
在Spirng中可以通过xml将组件注册到ioc中,SpringBoot默认不支持xml文件,因此可以通过配置类的方式手动注册
1.首先定义两个pojo类并提供getter、setter方法
2.新建一个配置类
2.1 使用注解@Configuration标识该类为一个配置类
2.2在配置类的内部使用@Bean注解注册相应类
方法名相当于bean的id。
方法返回的值,就是组件在容器中的实例
@Configuration
public class myConfig {
@Bean("newUser")
public User user(){
return new User();
}
@Bean
public cat newCat(){
return new cat();
}
}
这里可以通过bean的name/value值指定组件名,也可以通过方法名称指定组件名
4.myConfig配置类本身也被注册到ioc容器中,这是因为@Configuration注解
内部集成了@Component注解
5.配置类本质
输出后的地址表明这个配置类所属的bean是一个代理对象,基于CGLIB字节码增强
注解的proxyBeanMethods属性
这个属性规定了每次从容器中获得的bean是单例的还是多例的
这个值默认为true,即单例bean
这个属性解决了组件依赖问题:
单例模式下,从ioc中直接获取bean和调用getCat方法获取的bean是同一个bean
在多例模式下则每次都会获得新创建的bean
总结:
proxyBeanMethods:代理bean的方法
Full(proxyBeanMethods = true)【保证每个@Bean方法被调用多少次返回的组件都是单实例
的】
Lite(proxyBeanMethods = false)【每个@Bean方法被调用多少次返回的组件都是新创建的】
组件依赖必须使用Full模式默认。其他默认是否Lite模式
@Import注解
1.向容器中导入一个组件
1.1在config文件中导入普通组件@Import(value={Animal.class})
向容器中导入Animal类型的组件,名称为Animal的全限定名
注意:和使用bean注解注册没有区别,只是import方便些
@Configuration
@Import(value = {cat.class})
public class myConfig {
}
1.2 导入@Configuration注解修饰的类,用法与1.1相同@Import(value={Animal.class,myConfiguration.class})
工作中很常用,用于总配置类导入子配置类,当子配置类在包扫描范围之外时有用,也就是SpringBootApplicaion注解标识类的相应扫描范围
--newConfig--
@Configuration
@Import({demo1.class})
public class newConfig {
}
--myConfig--
@Configuration
@Import(value = {newConfig.class})
public class myConfig {
}
1.3 ImportSelector接口实现的类被导入
1.3.1创建 一个类,实现 ImportSelector 接口,并重写 selectImports 方法,方法返回的是需要导入类的全限定名的数组。
--ImportSelector--
public class ImportSelector implements org.springframework.context.annotation.ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{demo1.class.getName(), cat.class.getName()};
}
}
--myConfig--
@Configuration
@Import(value = {ImportSelector.class})
public class myConfig {
}
1.4 实现ImportBeanDefinitionRegistrar接口
1.4.1 创建一个需要导入的bean
public class demo2 {
public demo2() {
System.out.println("demo2");
}
}
1.4.2 创建一个类,实现ImportDefinitionRegistrar接口
public class ImportDef implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
boolean flag = registry.containsBeanDefinition(demo2.class.getName());
//containsBeanDefinition:判断容器中是否存在指定的 bean 定义,true 存在
if(!flag){
RootBeanDefinition beanDefinition=new RootBeanDefinition(demo2.class);
//注册BeanDefinition,并指定 beanName
registry.registerBeanDefinition("demo",beanDefinition);
}
}
}
1.4.3 在配置类中导入这个类
@Configuration
@Import(value = {ImportDef.class})
public class myConfig {
}
@Conditional注解
当我们需要在满足特定条件时再加载bean时,可以用到条件装配。ConditionalOnxxx意味着满足xxx时才将该注释下的所有bean装配到ioc容器中
@Target:说明spring自动扫描的所有类(包括@Configuration、@Component、@Service等)都可以通过添加@ConditionalOnxxx来进行条件装配。并且可以用在方法上,所以有@Bean注解标记的方法也可以应用条件装配注解
都是用了 @Conditional 注解来标记,OnBeanCondition 等自定义 Condition 还是实现了
Condition 接口的,换汤不换药,没什么神秘的,只不过做了更具象的封装罢了。
多个conditonal的作用:见spingboot课件
@Configuration
@Import({demo1.class})
public class AnewConfig {
}
@Configuration
@ConditionalOnBean(name = "com.xq.pojo.demo1")
@Import(value = {ImportDef.class})
public class myConfig {
@Bean("tri-by-demo1")
public User user(){
return new User();
}
}
注意
这里配置类有加载顺序,默认按照类的首字母加载,但是最终都能加载上
改进方法
-
使用@Order注解
@Configuration @Order(1) public class NewConfig { @Bean public demo1 demo1(){ return new demo1(); } }
2.使用@DependsOn注解
@ImportResource注解
SpringBoot默认不支持xml配置文件,如果强行使用则可以在启动类\controller中使用该注解
@RestController//@Controller + @ResponseBody("将返回值作为json字符串传递给浏览器")
@ImportResource("classpath:bean.xml")//类路径中寻找
public class newController {
@Autowired
newSer newSer;
@RequestMapping("add")
public String add(){
newSer.addUser();
return "add"+newSer;
}
}
或者在启动类上导入
@SpringBootApplication
@ImportResource("classpath:bean.xml") //导入XML配置文件
public class App {
public static void main(String[] args) {
//获得ioc容器
ConfigurableApplicationContext context =
SpringApplication.run(App.class, args);
User user = context.getBean(User.class);
System.out.println(user);
}
}
在resource下配置xml文件即可
属性注入
需要在application.properties(固定)中配置
1.使用value注解进行注入
--Car--
@Component
public class Car {
@Value("${car.name}")
String name;
@Value("${car.price}")
String price;
}
--controller--
@Autowired
Car car;
@RequestMapping("car")
public Car car(){
return car;
}
- 注意不要忘记@Component
2.使用批量处理注册
这里可以省去手动使用@Value注解的麻烦
需要两个注解
-
@ConfigurationProperties注解在Car类上,标注前缀来匹配Car类的字段
@ConfigurationProperties(prefix = "car") public class Car { String name; String price; }
-
@EnableConfigurationProperties注解标注在配置类上,表示开启某个类的属性配置
@Configuration @EnableConfigurationProperties(Car.class) public class NewConfig { }
开发技巧
lombok插件
1.首先导入lombok依赖,springboot已经对lombok进行版本管理,无需指定版本
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
2.使用方法:
2.1 @Data使用/GetterSettertoString方法的自动构建
@Data
public class newClass {
public String username;
public String password;
public Integer age;
}
@Data注解将帮用户自动定义getter & Setter & toString方法
public class newTest {
public static void mian(String[] args) {
newClass aClass=new newClass();
aClass.setAge(9);
}
}
2.2 构造方法的自动构建
2.21@AllArgsConstructor
@AllArgsConstructor
public class newClass {
public String username;
public String password;
public Integer age;
}
@AllArgsConstructor注解将自动构建带有全部参数的构造方法
public class newTest {
public static void mian(String[] args) {
newClass aClass=new newClass("eric","pwd",13);
}
}
注意只能是全部参数,缺省参数会报错
newClass aClass=new newClass("eric","pwd");//报错
2.22
@NoArgsConstructor自动构造无参构造函数
@NoArgsConstructor
public class newClass {
public String username;
public String password;
public Integer age;
}
public class newTest {
public static void mian(String[] args) {
newClass newClass = new newClass();
}
}
slf4j注解
- 注意slf4j注解为lombok插件支持的功能,必须导入lombok插件
加入该注解后可以直接使用内置log对象
@Slf4j
@RestController
public class newController {
@Autowired
newSer newSer;
@RequestMapping("add")
public String add(){
log.info("added"+newSer);//slf4j内置对象
newSer.addUser();
return "add"+newSer;
}
}
热部署
引入热部署依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
引入热部署插件
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
</plugins>
</build>
以后修改配置直接构建即可,不需要重启服务器
注意:更改依赖需要重启服务器