常用注解
- @Configuration
- @ComponentScan
- @Scope
- @Lazy
XML配置方式
@Configuration
public class AnnotationConfig {
@Bean
public Person person(){
return new Person().setIdCard("123456");
}
}
public class Test {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AnnotationConfig.class);
Person person = (Person) context.getBean("person");
System.out.println(person.getIdCard());
}
}
注解配置
Configuration注解
@Configuration
public class AnnotationConfig {
@Bean(name = "personNew")
public Person person(){
return new Person().setIdCard("123456");
}
}
class AnnotationTest {
@Test
public void testAnnotation() {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AnnotationConfig.class);
// Person person = (Person) context.getBean("person");
// System.out.println(person.getIdCard());
Object personNew = context.getBean("personNew");
Object personNew2 = context.getBean("personNew");
System.out.println(personNew == personNew2);
}
}
- Spring仅适用模板模式确定创建方法,创建的是一个对象
- 默认情况下使用方法名小写作为bean名称,如果添加了指定名称,以指定名称为准
ComponentScan 注解
@Configuration
@ComponentScan(basePackages = "project.model")
public class MyConfig {
}
测试内容如下,可以将包扫描的结果打印出来
class ComponentScanTest {
@Test
void testComponentScan() {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
String[] beanDefinitionNames = context.getBeanDefinitionNames();
System.out.println(Arrays.stream(beanDefinitionNames).toList());
}
}
本文中的项目目录结构如下图:
可以看到并没有将code>Person类加载到容器中,这实际涉及到ComponentScan
注解的定义,**@ComponentScan
默认会将根目录下的使用@Component、@Controller、@Serverice、@Configuration注解的类进行加载**,但是Person
并没有被相关注解标识所以无法识别,否则可以通过自定义Filter方式加载类。
Scope 注解
@Scope
标识了一个Bean是否单例或多例模式,默认情况下为单例模式。
主要的模式有以下四种:
ConfigurableBeanFactory.SCOPE_PROTOTYPE
ConfigurableBeanFactory.SCOPE_SINGLETON
WebApplicationContext#SCOPE_REQUEST
WebApplicationContext#SCOPE_SESSION
以下样例主要是针对多例方式测试,默认情况为单例模式
针对Person
类使用@Scope
注解配置为多例
@Data
@Accessors(chain = true)
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class Person {
private String name;
private String idCard;
}
class ScopeTest {
@Test
void testScope() {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyScope.class);
Object personNew = context.getBean("person");
Object personNew2 = context.getBean("person");
System.out.println(personNew == personNew2);
}
}
可以看到结果如下:
说明每次创建对象时都是不同的对象为多例模式。
Lazy 注解
@Lazy
注解主要是标识Bean是否是懒加载,懒加载顾名思义只有有在调用(getBean)时才会创建添加到容器中,非懒加载是在容器初始化前将所有bean都创建好,Spring默认是非懒加载模式。
@Configuration
public class MyConfig {
@Bean(name = "person")
public Person person(){
System.out.println("将bean添加到容器中");
return new Person().setIdCard("123456");
}
}
class LazyTest {
@Test
public void testAnnotation() {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
System.out.println("初始化容器");
Person person = (Person) context.getBean("person");
}
}
结果如下:
默认情况下是会将所有bean添加到容器中
@Configuration
public class MyConfig {
@Bean(name = "person")
@Lazy
public Person person(){
System.out.println("将bean添加到容器中");
return new Person().setIdCard("123456");
}
}
添加懒加载注解后的结果如下:
只有在使用该bean时才会将创建对象加载到容器中。