1.Spring源码系列一[注解大全]

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值