Spring注解驱动

本文详细介绍了Spring框架中的注解驱动,包括基础注解如@Configuration、@ComponentScan、@Scope、@Lazy等的使用,以及AOP注解的原理和步骤,最后提到了事务管理的@Transactional注解及其属性。这些注解在Spring应用中起着关键作用,帮助简化配置和实现面向切面编程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.1. Spring基础注解

1.1.1. @Configuration

Spring配置Bean有多种形式,一种是XML方式,一种是@Configuration注解的方式,表示是一个配置类(同XML功能相同),作为Bean的载体。

package org.springframework.context.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;
import org.springframework.stereotype.Component;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
/**
* 同@Component注解功能一样,只是语言不同
*/
public @interface Configuration {
    // 组件名称(bean的名称)
    @AliasFor(annotation= Component.class)
    String value() default "";
}

1.1.2. @ComponentScan

组件扫描注解,通过配置包、类、过滤器来扫描指定的类到spring上下文容器中,该注解在jdk8以后可以在同一个类上注解多个,可以通过basePackages、excludeFilters、includeFilters过滤注解,其中value同basePackages、Classes相当于一个属性,也可以自定义过滤方式如:

@ComponentScan(basePackages= {“com.bdr."},excludeFilters = { @Filter(type = FilterType.ANNOTATION, classes = Controller.class) })
@ComponentScan(value = "com.bdr.
”, excludeFilters = { @Filter(type = FilterType.CUSTOM, value = MyTypeFilter.class) }, useDefaultFilters = false)

public class MyTypeFilter implements TypeFilter {
	/**
	 * 自定义匹配模式,使用自定义的的过滤器,需要设置@Filter type = FilterType.CUSTOM、 属性useDefaultFilters = false
	 */
	public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory)
			throws IOException {
		AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
		String[] memberClassNames = annotationMetadata.getMemberClassNames();
		for (String v: memberClassNames) {
		System.out.println("memberClassNames:"+v);
		}
		return false;
	}
}

1.1.3. @Scope

常用于bean作用域于注解,定义Spring容器创建实例的方式。

/**
 * prototype:多实例,每次获取bean都会从容器中创建一个新的实例
 * singleton:单例,容器启动就创建一个实例
 * request:一次请求创建一个实例
 * session:一个会话创建一个实例
 * @return
 */
@Bean
@Scope("prototype")
public Employee myBean() {
	Employee employee = new Employee();
	return employee;
}

1.1.4. @Lazy

用于定义容器创建实例的时机(懒加载机制),容器创建时不实例化bean,当使用到该bean时实例化bean,该注解默认为value=true

@Bean
@Lazy
@Scope("prototype")
public Employee myBean() {
	Employee employee = new Employee();
	return employee;
}

1.1.5. @Import

用于快速向Spring容器添加Bean,该注解支持Configuration、ImportSelector、ImportBeanDefinitionRegistrar自定义导入方式和导入的类;@Import 导入时的是全类名。

  • ImportSelector

    @Import(value = { Depart.class, MyImportSelector.class })

public class MyImportSelector implements ImportSelector{

	/**
	 * 这里的返回值,不要返回null,返回一个空数组也可以
	 * 返回的数组就是,对应需要导入的包,通过ImportSelector 自定导入需要的包
	 */
	public String[] selectImports(AnnotationMetadata importingClassMetadata) {
		System.out.println("MyImportSelector>>>>: "+importingClassMetadata.getSuperClassName());
		System.out.println("MyImportSelector>>>>: "+importingClassMetadata.getEnclosingClassName());
		//  返回指定全类名的包,导入该指定包
		return new String[] {"com.bdr.bean.Depart4"};
	}
}
  • ImportBeanDefinitionRegistrar

    @Import(value = { Depart.class, MyImportBeanDefinitionRegistrar.class })

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {

	/**
	 * 通过ImportBeanDefinitionRegistrar 导入指定的bean
	 */
	public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
// importingClassMetadata 获取注解信息,BeanDefinitionRegistry bean注入操作。
		boolean containsBeanDefinition = registry.containsBeanDefinition("myWindowBean");
		if(containsBeanDefinition) {
		RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Depart4.class);
			registry.registerBeanDefinition("depart4444", rootBeanDefinition);
		}
	}
}
  • FactoryBean
// MyFactoryBean
public class MyFactoryBean implements FactoryBean<Depart5> {
/**
 * 返回实例
 */
public Depart5 getObject() throws Exception {
	return new Depart5();
}

/**
 * 指定类型
 */
public Class<?> getObjectType() {
	return Depart5.class;
}

/**
 * 通过FactoryBean 导入bean
 * @return
 */
@Bean
public MyFactoryBean myFactoryBean() {
	return new MyFactoryBean();
}

@Test
public void getConfig() {
	AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MainConfig.class);
	String[] beans = context.getBeanDefinitionNames();
	for (String v : beans) {
		System.out.println(v);
	}
	// 获取MyFacoryBean
	// 通过myFactoryBean获取到的是FactoryBean 创建的实例bean
	//
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值