1.组件注册@Configuration&@Bean给容器中注册组件
新建maven工程
导入spring-context包
新增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: */
)]