SpringBoot摒弃XML配置方式,改为全注解驱动
1. 组件注册
注解 | 作用 |
---|---|
@Configuration | 声明配置类 |
@SpringBootConfiguration | 声明配置类 |
@Bean | 声明Bean 对象 |
@Scope | 声明多实例实例、还是懒汉模式架子啊 |
@Controller | 用于指示Spring类的实例是一个控制器 |
@Service | 用于标识一个类作为服务层组件 |
@Repository | 用于标识一个类作为数据访问层组件 (Repository) |
@Component | Spring框架中的一个通用注解,用于标记一个类为组件,让Spring能够在应用程序启动时自动扫描并加载这些组件 |
@Import | 将普通类加载到Spring容器中 |
@ComponentScan | 告诉Spring扫描那些包下的类 |
实现方式:
1、@Configuration
编写一个配置类
2、在配置类中,自定义方法给容器中注册组件。配合@Bean
3、或使用@Import
导入第三方的组件
Demo
1. 创建实体类
先创建两个实体类,Cat
、User
package com.example.boot.Pojo;
public class Cat {
private Long id;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
public void setName(String name) {
this.name = name;
}
}
package com.example.boot.Pojo;
public class User {
private Long id;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
public void setName(String name) {
this.name = name;
}
}
2 配置类实现
2.1 使用@Bean
注解实现
package com.example.boot.conf;
import com.example.boot.Pojo.User;
import com.example.boot.Pojo.Cat;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
@Configuration
// @SpringBootConfiguration
public class JavaBootClass {
@Bean // 替代以前的Bean标签,组件在容器中的名字默认是方法名,可以直接修改注解的值
public User user() {
User user = new User();
user.setId(1L);
user.setName("TestUserBean");
return user;
}
/**
* 默认是单实例的
* @return
*/
@Scope("prototype") // 实现方式变化 多例实现
@Bean
public Cat cat() {
Cat cat = new Cat();
cat.setId(1L);
cat.setName("Test Cat Bean");
return cat;
}
}
2.2. 查看bean
对象
package com.example.boot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication
public class Boot302DemoApplication {
public static void main(String[] args) {
var ioc = SpringApplication.run(Boot302DemoApplication.class, args);
System.out.println("-------");
Object user = ioc.getBean("user");
Object user1 = ioc.getBean("user");
System.out.println(user);
System.out.println(user1);
System.out.println(user1 == user);
Object cat1 = ioc.getBean("cat");
Object cat2 = ioc.getBean("cat");
System.out.println(cat1 == cat2);
}
}
2.3 结果
-------
User{id=1, name='TestUserBean'}
User{id=1, name='TestUserBean'}
true
false
3 使用 @Import
实现
组件的名称默认是全类名
package com.example.boot.conf;
import com.alibaba.druid.FastsqlException;
import com.example.boot.Pojo.User;
import com.example.boot.Pojo.Cat;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.Scope;
@Import(FastsqlException.class) // 给容器中 放指定类型的组件,组件的名称默认是全类名
@Configuration
// @SpringBootConfiguration
public class JavaBootClass {
}
查看结果
package com.example.boot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication
public class Boot302DemoApplication {
public static void main(String[] args) {
var ioc = SpringApplication.run(Boot302DemoApplication.class, args);
String[] names = ioc.getBeanDefinitionNames();
for (String name : names) {
System.out.println(name);
}
}
}