本文共 4836 字,大约阅读时间需要 16 分钟。
@ComponentScan()
注解:
@ComponentScan value
:指定要扫描的包
excludeFilters = Filter[]
:指定扫描的时候按照什么规则排除那些组件
includeFilters = Filter[]
:指定扫描的时候只需要包含哪些组件
高级使用特性:Filter的使用:使用自定义的TypeFilter 按照一定的类型 进行注解的扫描
@ComponentScan(value = "com.spring", excludeFilters = { @ComponentScan.Filter(type = FilterType.CUSTOM ,classes = { MyTypeFilter.class})})
public enum FilterType { ANNOTATION,//默认的就是使用注解的类型进行过滤 ASSIGNABLE_TYPE,// 按照给定的类型; ASPECTJ,// 使用ASPECTJ表达式 REGEX, //使用正则指定 CUSTOM// 这里是使用给定的过滤规则进行注解的扫描}
public class MyTypeFilter implements TypeFilter { /** * metadataReader:读取到的当前正在扫描的类的信息 * metadataReaderFactory:可以获取到其他任何类信息的 */ @Override public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException { // TODO Auto-generated method stub //获取当前类注解的信息 AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata(); //获取当前正在扫描的类的类信息 ClassMetadata classMetadata = metadataReader.getClassMetadata(); //获取当前类资源(类的路径) Resource resource = metadataReader.getResource(); String className = classMetadata.getClassName(); System.out.println("--->"+className); if(className.contains("er")){ // 只有类名包含er的才进行扫描 return true; } return false; }}
@Scope() 注解的使用:
scope:详解:
@Scope("prototype")
和 在xml中的bean标签中的scope属性是一致的<bean id="person" class="com.spring.entities.Person" scope="prototype" lazy-init="true">
懒加载: 懒加载:容器启动不创建对象。第一次使用(获取)Bean创建对象,并初始化;
指定bean的初始化方法 和 销毁方法的方式:方法中不能有参数 但是可以抛出异常
在xml配置文件中指定bean标签的 <bean id="person" class="com.spring.entities.Person" init-method="" destroy-method="">
第二种方式就是 在@bean
注解中指定 init method 和 destroy method
@Bean(initMethod = "init", destroyMethod = "destroy")public Car car(){ return new Car();}
第三种方法使用@PostConstruct
@PreDestroy
注解
@PostConstruct //方法中不能有参数 但是能有异常public void init() throws RuntimeException{ System.out.println("car init....");}@PreDestroypublic void destroy(){ System.out.println("car destroy ....");}
第四种方式: 实现InitializingBean 接口 进行初始化方法实现 afterPropertiesSet()
实现销毁方法的接口就是disposablebean接口 实现destroy()
方法
public class Cat implements InitializingBean, DisposableBean { public Cat(){ System.out.println("new cat"); } @Override public void destroy() throws Exception { System.out.println(" cat dead.... DisposableBean"); } @Override public void afterPropertiesSet() throws Exception { System.out.println("cat born... afterPropertiesSet"); }}
Spring 中工厂类的使用:implements FactoryBean<T>
public class MyFactoryBean implements FactoryBean{ // 创建实例 @Override public Color getObject() throws Exception { return new Color(); } // 返回的是bean的class @Override public Class getObjectType() { return Color.class; } // 要是返回的是true表示的是单例 @Override public boolean isSingleton() { return true; }}
需要注意的一点:
// 使用这样的方式创建出来的其实是color类型的不是工厂 所以传入的类型也是 color类型不是 工厂类型Object myFactoryBean = annoBeans.getBean("factoryBean");Object myRealFactoryBean = annoBeans.getBean("&factoryBean");//这样才能获取到工厂的实例
BeanPostProcessor的使用: implements BeanPostProcessor
@Component// 使用的时候需要也是一个组件需要加入到容器中public class MyBeanPostProcessor implements BeanPostProcessor { // 初始化之前的后置处理 @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println(beanName+"postProcessBeforeInitialization--->"+bean); return bean; } // 初始化之后的后置处理 @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println(beanName+"postProcessAfterInitialization--->"+bean); return bean; }}
属性注入相关的注解:
@Value("张三") //1、基本数值private String name;@Value("#{20-2}") //2、可以写SpEL; #{}private Integer age;@Value("${person.nickName}") //3、可以写${};取出配置文件【properties】中的值(在运行环境变量里面的值)private String nickName;
自动注入相关的注解:
@Autowired
:自动注入
:默认优先按照类型
去容器中找对应的组件:applicationContext.getBean(XXXclass);找到就赋值 如果找到多个相同类型的组件,再将属性的名称作为组件的id去容器中查找
@Qualifier()
:使用@Qualifier指定需要装配的组件的id,而不是使用属性名自动装配默认一定要将属性赋值好,没有就会报错可以使用@Autowired(required=false);
@Primary
:让Spring进行自动装配的时候,默认使用首选的bean
也可以继续使用@Qualifier指定需要装配的bean的名字
@Resource
:可以和@Autowired一样实现自动装配功能;默认是按照组件名称
进行装配的(相当于 Autowired + Qualifier)没有能支持@Primary功能没有支持@Autowired(reqiured=false);
@Inject:
需要导入javax.inject
的包,和Autowired的功能一样
。、没有required=false的功能 @Autowired:Spring定义的; @Resource、@Inject都是java规范
转载地址:http://hfxrn.baihongyu.com/