spring组件添加_01

1.组件注册@Configuration&@Bean给容器中注册组件

新建maven工程

导入spring-context包

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XD0w5pfx-1604371930192)(C:\Users\littl\AppData\Roaming\Typora\typora-user-images\image-20201031151133863.png)]

新增JavaBean类

在这里插入图片描述

JavaBean 添加getter、setter、无参构造方法、有参构造方法、toString()方法

新增注入配置文件(方式一:xml配置文件)

在这里插入图片描述

junit测试(xml bean注入方式)

导入junit5 依赖包

  		<!--
         JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage
         -->
        <!-- https://mvnrepository.com/artifact/org.junit.platform/junit-platform-launcher -->
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-launcher</artifactId>
            <version>1.7.0</version>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.7.0</version>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.junit.vintage/junit-vintage-engine -->
        <dependency>
            <groupId>org.junit.vintage</groupId>
            <artifactId>junit-vintage-engine</artifactId>
            <version>5.7.0</version>
            <scope>test</scope>
        </dependency>

测试

    @Test
    void testBefore(){
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("person.xml");
        Person person = (Person) applicationContext.getBean("person");
        System.out.println(person);
    }

在这里插入图片描述

新增注入配置文件(方式二:配置类方式)

在项目根目录下添加config包,新建PersonConfig类

package config;

import bean.Person;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Description: 配置类
 */
@Configuration
public class PersonConfig {

    @Bean
    public Person person(){
        return new Person("李四",25);
    }
}

junit测试

    @Test
    void testAnnotation(){
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext("config");
        Person person = (Person)  applicationContext.getBean("person");
        System.out.println(person);
    }

在这里插入图片描述

2.组件注册@ComponentScan自动扫描组件&指定扫描规则

xml配置方式

<!-- 扫描bean包下的所有@Component, @Repository, @Service, @Controller, @Configuration  -->
<context:component-scan base-package="bean"></context:component-scan>

注解配置方式(配置类上添加注解)

@Configuration
@ComponentScan(value = "com.demo")
public class PersonConfig {

    @Bean
    public Person person(){
        return new Person("李四",25);
    }
}

@ComponetScan默认扫描使用此注解类所在的包(当前包及其子包中包含@Component,@Repository,@Service,@Controller,@Configuration注解的类)

貌似不能配置根目录,???

若想设置根目录,只能把根目录中的每一个一级包名都添加上,如下:

@ComponentScan(value = {"controller","service","dao"})

当前测试项目就是把controller、service、dao都放到了根目录下,项目目录结构如下:

在这里插入图片描述

junit测试

import config.PersonConfig;
import org.junit.jupiter.api.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class ComScanTest {

    @Test
    void testComponet(){
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(PersonConfig.class);
//        获取容器中已定义的bean
        String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
        for(String name:beanDefinitionNames){
            System.out.println(name);
        }
    }
}

在这里插入图片描述

注解配置(过滤指定注解)

package config;

import bean.Person;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;

@Configuration
@ComponentScan(value = {"controller", "service", "dao"},
        excludeFilters = {//排除过滤器
                @ComponentScan.Filter(
                        type = FilterType.ANNOTATION,//以ANNOTATION类型确定
                        value = {
                                Controller.class//注解有Controller注解的类
                        }
                )
        })
public class PersonConfig {

    @Bean
    public Person person() {
        return new Person("李四", 25);
    }
}

@ComponentScan中还有很多其他的配置,详细可参考spring-framework官网中第Using Filters to Customize Scanning章节。

3.组件注册@scope 设置组件作用域

配置类(新增配置类2)

package config;

import bean.Person;
import org.springframework.context.annotation.*;
import org.springframework.stereotype.Controller;

@Configuration
public class PersonConfig2 {

    @Bean
    @Scope //添加scope注解
    public Person person() {
        System.out.println("调用获取对象方法");
        return new Person("李四", 25);
    }
}

junit测试类

import bean.Person;
import config.PersonConfig;
import config.PersonConfig2;
import org.junit.jupiter.api.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class ComScanTest2 {

    @Test
    void testComponet(){
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(PersonConfig2.class);
//        Person person = (Person)  applicationContext.getBean("person");
//        System.out.println(person);
    }
}

测试代码中把获取bean对象的代码注释,执行后,控制台如下

在这里插入图片描述

spring中bean的创建默认是单例的,是在容器启动的时候,就调用注入bean的方法。可以使用@scope注解来修改作用域

    /**
     * @Scope取值
     *          singleton:单例模式(默认模式);容器启动即新建bean;
     *          prototype:多例模式;从容器中获取bean时才新建bean;
     *                      获取一次,新建一个
     */
    @Bean
    @Scope(value = "prototype")
    public Person person() {
        System.out.println("调用获取对象方法");
        return new Person("李四", 25);
    }	

在这里插入图片描述
在这里插入图片描述

/**
 * @Scope取值
 *          singleton:单例模式(默认模式);容器启动即新建bean;
 *          prototype:多例模式;从容器中获取bean时才新建bean;
 *                      获取一次,新建一个
 *          request:
 *          session:
 */

)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值