Spring注解驱动开发个人心得总结

本文详细介绍了Spring框架中的关键概念和技术,包括Bean的注册方式、作用域、生命周期管理、依赖注入、条件化Bean注册、切面编程及声明式事务处理等内容。

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

注册bean的方式

当我们在使用spring的时候,要想注册一个bean到ioc容器里面有使用注解的方式和使用xml配置文件的方式。一般使用@Bean注册的是第三方的组件

  1. 其中使用xml配置需要在resources下面新建一个xml文件,然后在里面编写bean以及初始化的一些属性,在测试的时候我们可以用new classpathApplationcontext(“文件名.xml”) 获取容器中的注册的bean
  2. 使用注解的方式,首先我们要创建一个类,并且要在类上声明一个@Configuration注解,在这个类里面我们就可以编写要注入的bean,比如 public People people(){return new People(“张三”,13)},并且要在这个方法上加上@Bean注解,这个bean的话可以自定义一些配置,比如配置名字

通过自动扫描的方式注册bean

我们可以在xml配置文件或者使用@ComponentScan的方式配置一定的策略扫描被@Controller,@Service,@Repository,@Component所修饰的类,当spring容器启动的时候会自动扫描注册bean到ioc容器里面。我们可以在@ComponentScan里面配置,比如过滤哪些bean不被扫描,只扫描哪些类型的bean或者是自定义的包的路径和自定义的过滤器(定义一个类实现TypeFilter,然后实现里面的match方法,可以自定义的方式实现过滤bean)

@Scope注解详解

这个注解有点意思,里面的属性主要是配置bean的作用域,有Prototype,Singleton,request,session。常用的就前两个,其中使用Prototype的时候,spring容器在启动的时候并不会去调用方法创建对象,而是在要被获取这个bean的时候才会调用方法创建对象,是多实例的。而SIngleton的话,spring容器在启动的时候就会调用方法创建对象到ioc容器里面,在程序中获取多次都是拿的同一个实例,都是从容器中直接拿。后面的request是同一个请求创建一个实例,session是同一个session创建一个实例

@Lazy懒加载

对于使用了@Scope(“Singleton”) 单实例的bean,因为单实例bean会在容器启动的时候就会调用方法创建对象,而加上@Lazy之后,就会在获取这个单例bean的时候调用方法创建对象

@Condition根据条件注册bean

该注解可以放在类上也可以标注在方法上,当标注在类上的时候,只要满足自定义配置的规则就可以注册该类下面所有的bean,不满足就不注册,当标注在方法上时,只有满足了自定义的配置规则就可以注册该bean。自定义配置的规则按照自己定义一个类实现Condition接口,重写match方法,自定义条件然后返回true就配置好了,配置完之后再@Condition注解里面加上({实现的接口.class})即可。

@Import注册bean

使用@import注册bean有3种方式,第一种直接 要加载的类名.class,第二种定义一个类实现ImportSelector,就可以定义返回组件的全类名的数组集合,第三种就是实现ImportBeanDefinitionRegistrar接口,可以自定义一些条件,当满足的话注册bean到ioc容器里面。

使用Spring提供的FactoryBean(工厂Bean)来注册bean

定义一个类实现FactoryBean<要创建的Bean> ,重写里面的方法即可。

Bean的声明周期–bean的初始化和销毁方法

  1. 通过注解的方式

    如果一个bean是单例的,那么在spring容器启动的时候就会被创建,如果bean是多实例的,那么这个bean要被使用的时候才会被创建。

    对于初始化,在@Bean(initMethod = “初始化方法”)定义,如果定义了初始化方法的话,当对象创建完成并赋值好后会调用初始化方法。

    而对于销毁,在@Bean(destroyMethod =“销毁方法”),如果是单实例的bean会在容器销毁的时候调用,如果是多实例的bean,容器不会调用这个销毁方法,因为没有被管理。

  2. 通过对象的类实现 InitializingBean, DisposableBean接口

    实现之后重写初始化方法和销毁方法即可。

  3. 通过在对象的类里面的初始化和销毁方法加上@PostConstruct 和 @PreDestroy注解

特殊:实现BeanPostProcessor接口,在bean的初始化前后进行一些处理工作(在以上三种初始化前后处理)

  1. postProcessBeforeInitialization:在初始化之前工作
  2. postProcessAfterInitialization:在初始化之后工作

(关于Bean的声明周期还要再看一遍)

属性赋值

在spring中给容器中的对象赋值有三种方式,在属性上面加@Value(“属性”),使用SPEL表达式@Value("#{20-2}"),使用@Value("${ }") 取出配置文件的值(在运行环境变量里面的值)

@Value("${ }")详解

在resources下面创建一个properties的文件,然后设置一些属性值,在配置类上面加上@PropertySource(value = "classpath:/CarFei.properties") 就会将该配置文件在spring容器启动的时候加载进去,然后利用@Value("${ 配置文件中设置的属性名 }") 即可赋值成功

在test类下面容器启动获取全局环境的参数值,将这个值赋值到对象里也可以完成属性赋值

自动装配

在一个类里面想使用另一个类的方法,则在使用方加上@Autowired就可以实现bean的自动注入,当在容器中没有找到bean时会报错,如果使用@Autowired(required=false)时,当没有找到bean直接为null;其次@Autowired是先按照类型进行注入,如果根据类型匹配有多个bean则再根据注入的name进行匹配。

当我们同时使用@Autowire和@Qualifier(“bookDao”) 时,@Qualifier它的作用是只会根据这个名字来加载bean,而不是根据类型

也可以在bean上加@Primary,表明该bean被加载的优先级高,在spring容器进行装配的时候默认使用首选bean

也可以在bean上加@Resource(name=“bookDao2”) ,是按照名称进行查找bean进行注入

@Autowire自动注入方式

  1. 构造器注入
  2. setting方法注入
  3. 放在参数的位置上

Aware相关的接口

可以自定义组件实现xxxAware,在创建对象的时候,会调用接口规定的方法注入相关组件。Aware的作用就是把spring底层的一些组件注入到我们自定义的bean里面

@Profile可以切换不同环境下的配置

当@profile加在类上的时候,不满足条件则整个类都不会被加载

当@Profile加在方法上的时候,会根据spring.profiles.active=选择的环境,来进行加载

还有一种是在容器加载的时候设置一些环境参数

		// 使用无参构造器(有参的会自动创建并刷新容器)
		AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
		//1、创建一个applicationContext
		//2、设置需要激活的环境
		applicationContext.getEnvironment().setActiveProfiles("dev");
		//3、注册主配置类
		applicationContext.register(MainConfigOfProfile.class);
		//4、启动刷新容器
		applicationContext.refresh();

AOP

报错:Null return value from advice does not match primitive return type for

原因:不管是cglib代理还是jdk代理,你的返回值必须是包装类。当你要返回的值是一个int类型的就会报错

解决办法:将返回值int改为包装类型的Integer

为什么一定要用Integer而不能用int类型?

因为代理的方法返回值为void,就返回null;否则就返回meth.invoke(my,args)。返回的null值必须用包装类来接收,所以用基本类型int会报错类型不匹配

当我们要在代码中想让代码在前后都执行一句话,那么我们可以定义一个切面,这个切面类上加@Aspect注解,表明这是一个切面类,在切面类方法里面加一些方法,比如@Before,@After,@AfterReturning,@AfterThrowing。可以在这些方法参数里面加上JointPoint可以获取这个方法,参数等信息。

还需要在配置类上开启切面@EnableAspectJAutoProxy

aop源码看不懂,嗷嗷嗷嗷~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~留下了伤心的泪水…;.;.;;.;.;我还会回来的,先打个卡2022年3月27日13:21:22

声明式事务

当在spring中我们要使用事务的时候,分为2种,一种是声明式事务(常用)还有一种是编程式事务(耦合性太高,一般不用)

当我们要在一个方法上使用事务的时候,首先要在方法上加上@Translation注解,然后在配置类上加上@EnableTransactionManagement用来开启事务管理,最重要的就是要在配置类中加上事务管理器PlatformTransactionManager

@EnableTransactionManagement 小小的解析

里面有一个类进行事务的拦截器TransactionInterceptor,

  1. 先获取事务相关的属性,然后获取事务管理器PlatformTransactionManager,
  2. 执行目标方法
    1. 如果出现异常,获取到事务管理器,利用事务管理进行回滚
    2. 如果正常执行就利用事务管理器进行提交事务

Spring容器创建过程

Spring容器在启动的时候,会先保存通过xml文件或者注解的方式来注册Bean的定义信息。然后Spring容器会在合适的时机创建这些bean。后置处理器会在每一个bean创建完成,都会使用各种后置处理器来进行处理来增强bean的功能。同时还会注册事件驱动模型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值