1.1组件注册
1.1.1 XML方式
public class Teacher {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Teacher{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class MainTest {
public static void main(String[] args) {
/** 使用XML相关的容器 */
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(“beans.xml”);
Person bean = (Person) applicationContext.getBean(“person”);
System.out.println(bean);
}
}
1.1.2 @Bean方式
public class Teacher {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Teacher{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
@Configuration
public class MainConfig {
/** 默认方法名就是bean的名字,也可以自己指定bean的名字 */
@Bean("teacher")
public Teacher teacher(){
Teacher teacher = new Teacher();
teacher.setName("王五");
teacher.setAge(35);
return teacher;
}
}
public class MainTest {
public static void main(String[] args) {
/** 使用注解相关的容器 */
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
Teacher bean = (Teacher) applicationContext.getBean(“teacher”);
System.out.println(bean);
}
}
/***************** @Bean+方法参数,方法中这个对象默认从IOC容器中获取*/
public class Car {
}
public class Color {
}
@Configuration
public class MyMainConfig {
@Bean
public Car car(Color color){
System.out.println("@Bean这里获取到的容器中的color对象:"+color);
return new Car();
}
/**
* 要保证把Color注入到容器中,这样上面的方法中才可以从容器中拿到Color实例
* @return
*/
@Bean Color color(){
return new Color();
}
}
public class MainTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MyMainConfig.class);
Color color = (Color) applicationContext.getBean(“color”);
System.out.println(“容器中的color:”+color);
}
}
@Bean这里获取到的容器中的color对象:org.springframework.hpl.Color@5c18298f
容器中的color:org.springframework.hpl.Color@5c18298f
1.1.3 @ComponentScan方式
1.1.3.1 基本用法
/** 指定包的扫描路径 /
/*
- @ComponentScan指定包的扫描范围:
- 可以扫描到当前路径下带有@Component,@Controller,@Service,@Repository,@Cofiguration注解的类
*/
@ComponentScan(“org.springframework.hpl”)
public class MainConfig {
}
/** 在改路径下声明带有@Component,@Controller,@Service,@Repository,@Cofiguration注解的类 */
@Configuration
public class TeacherConfig {
}
@Controller
public class TeacherController {
}
@Service
public class TeacherService {
}
@Repository
public class TeacherDao {
}
public class MainTest {
public static void main(String[] args) {
/** 使用注解相关的容器 */
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
Arrays.stream(applicationContext.getBeanDefinitionNames()).forEach(System.out::println);
}
}
/** 打印结果 /
/* 容器声明的类的打印结果*/
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
/** 以下是用户自己声明的类的打印结果*/
mainConfig
teacher
teacherConfig
teacherController
teacherDao
teacherService
1.1.3.2 excludeFilters
与@ComponentScan配合使用,表示排除指定的类
@ComponentScan(value = “org.springframework.hpl”,excludeFilters = {
/** 排除掉带有@Configuration注解的类,classes里面是注解的集合*/
@Filter(type= FilterType.ANNOTATION,classes={Configuration.class}),
/** 排除掉指定类型的类,classes里面是类的集合*/
@Filter(type = FilterType.ASSIGNABLE_TYPE,classes = {Teacher.class}),
})
public class MainConfig {
}
/**
- 对比之前的结果,我们将发现,teacherConfig与teacher两个类的创建会被排除掉
/
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
mainConfig
teacherController
teacherDao
teacherService
�1.1.3.2 includeFilters
与@ComponentScan配合使用,表示只包括指定的类
/* 注意使用includeFilters时需要关闭默认Filter策略 /
@ComponentScan(value = “org.springframework.hpl”,includeFilters = {
/* 表示只能包括含有@Controller,@Service注解的类*/
@Filter(type= FilterType.ANNOTATION,classes={Controller.class, Service.class})
},useDefaultFilters = false)
public class MainConfig {
}
/**
- 对比之前的结果,我们将发现,只有标记有@Controller,@Service注解的类被包括进来
*/
Task :spring-context:MainTest.main()
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
mainConfig
teacherController
teacherService
�1.1.3.3 自定义Filter
使用自定义Filter可以实现自定义的方式来排除,或者只包含某些类
public class MyTypeFilter implements TypeFilter {
/**
* metadataReader:当前类的元数据信息读取器
* metadataReaderFactory: 元数据工厂读取器
*/
@Override
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory)
throws IOException {
/** 获取当前类的注解信息*/
AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
/** 获取当前类的元信息*/
ClassMetadata classMetadata = metadataReader.getClassMetadata();
/** 获取当前类的元数据解析资源信息*/
Resource resource = metadataReader.getResource();
/** 自定义规则,如果类名字包含Controller的匹配*/
String className = classMetadata.getClassName();
if(className.contains("Controller")){
return true;
}
return false;
}
}
/** 只包含时使用自定义信息 */
@ComponentScan(value = “org.springframework.hpl”,includeFilters = {
@Filter(type= FilterType.CUSTOM,classes={MyTypeFilter.class})
},useDefaultFilters = false)
public class MainConfig {
}
/** 结果将只包含teacherController */
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
mainConfig
teacherController
/**
排除时使用自定义信息:
注意使用excludeFilters不能设置,useDefaultFilters = true,或者使用默认值,直接不设置
*/
@ComponentScan(value = “org.springframework.hpl”,excludeFilters = {
@Filter(type= FilterType.CUSTOM,classes={MyTypeFilter.class})
},useDefaultFilters = true)
public class MainConfig {
}
/** 结果将排除teacherController */
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
mainConfig
teacher
teacherConfig
teacherDao
teacherService
1.1.4 @Scope
singleton: 单实例的(默认),在容器启动的时候就会创建。
@Configuration
public class MyMainConfig {
/** singleton 是默认的,可以不写,表示单实例的,在容器启动时创建*/
@Scope(scopeName = "singleton")
@Bean
public Teacher teacher() {
System.out.println("调用了构造器...");
Teacher teacher = new Teacher();
teacher.setAge(19);
teacher.setName("杜心五");
return teacher;
}
}
public class MainTest {
public static void main(String[] args) {
/** 可以看到,没有使用teacher这个对象,但是在容器启动的时候还是创建了这个对象 */
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MyMainConfig.class);
}
}
/** 可以看到,没有使用teacher这个对象,但是在容器启动的时候还是创建了这个对象 */
Task :spring-context:MainTest.main()
调用了构造器…
prototype: 表示多实例的,在容器启动不会创建,而是在使用这个对象的时候才会创建。
@Configuration
p