进击的小羊

  1. 首页
  2. 后端
  3. Java
  4. 正文

Spring 注解式编程

2018年7月14日 573点热度 0人点赞 0条评论

常用注解

  • @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时才会将创建对象加载到容器中。

标签: Java Spring
最后更新:2022年3月21日

qizi

一生懸命,步履不停

点赞
下一篇 >
分类
  • Java
  • 大数据
  • 数据库
  • 杂项
文章目录
  • 常用注解
    • XML配置方式
  • 注解配置
    • Configuration注解
  • ComponentScan 注解
  • Scope 注解
  • Lazy 注解

COPYRIGHT © 2022 进击的小羊. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang