文章目录
- 注解开发
- 注解开发定义bean
- 纯注解开发
- 注解开发bean作用范围与生命周期管理
- 注解开发依赖注入
- 注解开发管理第三方bean
- 注解开发实现为第三方bean注入资源
- 总结
注解开发
Spring的配置我们已经告一段落了,那接下来我们就要发挥Spring的强项了:
简化开发
;那么如何做呢,使用注解
就能加快开发速度,我们就要来学习Spring的注解开发
🎈🎈。
注解开发定义bean
首先我们先来看看代码环境👇👇
-
dao层实现类
-
service注入dao
-
配置文件中仅配置了一个dao
-
主程序中我们获取到dao的bean以后直接打印它
-
运行结果
接下来我们来看看如何使用
注解
的形式来开发Spring程序,在配置中现在仅仅配了一个dao的bean,那我们就先做第一件事,把它改成注解开发的,不把它写到配置文件中,那我们就需要写到类中去,由于是对dao层的实现类配置的bean,那我们就需要写到这个类中去,怎么写呢,需要在这个类中加一个注解
,@Component
,什么意思呢,叫做组件
,把它写上以后就代表了我们配置文件中的<bean/>
,现在我们就配置了一个bean👇👇
但是没有给它起名称,如果想要给它起名称应该怎么做,就要在它后边加括号写上它的名称就可以了,比如我们要给它起名为bookdao👇👇。
我们可以点开Component的源码,它在里边提供了一个
value属性
,由于value可以不写,所以我们在这里直接使用上边的格式就可以了🎉🎉。
我们把这弄完以后,新的问题就有了,按照这个形式,我们的bean已经配完了,那我们配置文件中配bean的那句话就可以删除了,但是Spring的配置文件怎么知道我们的实现类中写了
@Component("bookdao")
呢,换句话说,你随便找一个类,写一个这个东西就行吗?看来我们得让Spring容器感知到你这里写了这么一个东西,怎么办呢,我们就要去搜索它、找它,因此在Spring的配置文件中提供了这么一个标签
,注意这个标签是属于context命名空间的
,怎么写:context:component-scan base-package="com.itheima.dao.impl"/>
,这样就指定到了这个类所在的位置就可以扫到这句话了👇👇。
我们也可以用这种方式对
service
进行注解👇👇。
当然这里也可以不在注解里边写对应的bean的名称,然后在主程序中通过类型来获取bean🎉🎉。
在这里我们要说一下,Spring给我们提供了@Component的三个衍生注解,什么意思呢,它说你都写@Componment可能分的不是多么清楚,这样,我给你三个衍生注解你能分的更清晰一些👇👇。
注意:三个衍生类和@Component的作用一模一样,只是为了更好的去区分
。
纯注解开发
前边我们说了Spring3.0升级了
纯注解开发模式
,也就是说一点配置文件都不写了,那接下来咱们就来说一下纯注解开发该怎么做🎈🎈。
回到我们程序中,我们来想一件事,如果我们在配置文件中写的context:component
这句话没有的话,那我们的配置文件不就只剩下一个壳了吗,那我们就完全可以删掉配置文件了,但是问题是现在还有这么一句话,看来我们得换一种形式来表现它,那怎么换呢,对于Java程序来说,我们主要写的是类,那如果说现在我们不写配置文件了,那还能写什么呢,用类来替换它
,我们来学习一下该怎么去做 💪💪。
我们新建一个类叫做:
config.SpringConfig
,我们用这个类来代替我们之前的配置文件👇👇。
我们只需要在这个类的上边加一个
@Configuration
,这句话写上以后就代表这是一个配置类了,这句话就代表了配置文件中的这些东西👇👇。
但是我们的
context:component
这句话还没有搬过去,那我们现在要把它搬过去,应该怎么做,我们要在我们的配置类里边再加一个注解扫描我们的Component,这样写:@ComponentScan("com.itheima")
,括号里边的内容是要指定的包👇👇。
到这我们的配置类就已经完全替换完了,现在这个配置文件其实就可以直接删掉了,那么现在问题就来了,我们的应用程序就不行了👇👇。
我们在获取容器的时候是需要加载配置文件的,所以现在就不能这么写了,我们来重新写一下应用程序👇👇。
在上边我们仍然需要
加载
我们的配置,注意不是配置文件,是配置类
,上边框出来的就是加载配置类的代码,剩下来的事和前边写的完全一样🎉🎉。
- 注意:
注解开发bean作用范围与生命周期管理
以下是程序的初始环境👇👇。
现在运行出来应该出来的是
单例对象
,那怎么设置它为非单例对象
呢,只需要在BookDaoImpl类中
写上@Scope("prototype"):非单例
,或@Scope("singleton"):单例
👇👇。
如果想要控制它的生命周期该怎么做呢,我们先来两个方法,把我们生命周期的方法做出来,
@PostConstruct
是配置初始化方法,PostConstruct的中文意思就是在构造方法之后,我们前边学过init()方法就是在构造方法之后执行的,@PreDestory
是配置销毁方法的,PreDestory中文意思是在销毁之前的意思,也就是彻底销毁之前👇👇。
我们在主程序中使用关闭容器的方式来做👇👇。
注解开发依赖注入
在这块我们只学习一个东西:
自动装配
,我们先来熟悉一下程序环境👇👇。
当我们运行的时候会发现service的运行ok,但是第二句执行我们的dao的操作因为没有注入成功所以说它是个空对象👇👇。
我们来解决这个问题,怎么样给它注入对象呢,在service的实现类中写上
@Autowired
,就可以了,那它是按照什么装配的呢,我们可以看一下我们的dao有名吗,没有,它是按类型转配的
,这个注解哪个位置都可以放, 所以我们拿掉set方法也是可以的
,这是使用反射里边的暴力反射给BookDao的对象直接加值了,
那我们如果有两个数据层的实现呢,该怎么办,或者说应该装配哪一个,要想解决这个问题,我们就要用到
按名称装配
,接下来我们起名👇👇。
现在我们仅仅是起了两个名称,Sping可以支持按名称注入,如果在注入的过程中有多个相同的bean,使用
@Qualifier
来指定名称,想要注谁就把谁的名称写上👇👇。
注意
:@Autowired必须保留❗❗
现在我们再来看看简单类型如何去做,我们在dao的实现类中加一个属性name,简单类型这么写:
@Value()
,括号里边写入它的值👇👇。
我们现在的这个值是写死的,为了不让写死,我们来学习一下如何让它加载外部的
property文件
👇👇。
在配置中我们如果想要加载它,必须还要用到一个性:
@PropertySource()
,里边写文件名👇👇。
写完它以后,我们应该在dao层的实现类中如何用呢,接下来我们看看👇👇。
注意
:如果配置文件过多的话,需要用到数组
👇👇,这个里边不支持通配符。
注解开发管理第三方bean
前边我们做的注解开发都是管理自己的bean,那还有一堆你管不着的呢,那些第三方的我们如何在人家的jar包里边写@Component这些,我们接下来学习
第三方bean如何管理
✍️✍️。
我们先来熟悉一下程序环境👇👇。
管理第三方bean,由于不能直接把配置写在人家的源代码中,所以在这里边我们就必须去写它,怎么写👇👇
- 导入依赖坐标
-
在SpringConfig中定义一个方法获得要管理的对象
-
把方法的返回值定义成一个bean
-
主程序
这就是我们管理第三方bean的方式,如果想要管理多个,继续在SpringConfig中写方法就行了💪💪。
现在还存在一个问题,我们刚才是在Spring的配置文件中写的,我们的这个bean是与jdbc有关的,如果都写在我们Spring的配置文件中,都写在这里面是不是就挤爆了,怎么办,拆出去,写一个独立的配置文件👇👇。
- 第一种方式
注意
:这种方式不推荐使用❗❗
- 第二种方式
然后
注掉
JdbcConfig配置类中的@Configuration
就行了🎉🎉。
注解开发实现为第三方bean注入资源
如果我们上边配置类中配置的bean还需要其他的东西应该怎么办,接下来我们先来看第一种,
简单类型
缺了怎么办,比如说DriverClassName
的值不应该是来自我们的配置文件吗,我们怎么能直接写在配置类中呢,所以我们在上面的基础上还需要改一下,对于简单类型,它的写法比较粗暴👇👇
接下来我们看看
引用类型
如何注入,引用类型的注入方式比较特殊,我们需要在它的方法的参数位置,传递你想要的东西,我们假设
它运行需要dao, 首先我们先的把扫描给它打开👇👇。
现在的效果是,容器一启动,我们的dao层的bean就加载了,容器中有这个bean了,这是第一,第二我们在配置类中配置的第三方bean需要dao层的bean,那我们就要给它写上👇👇,并且我们在里边打印bookdao。
我们从运行结果中的确发现,这个bookdao打印出来了,其实我只是在方法里传了一个参数,为什么就能打印出来呢,这是因为
自动装配
,因为它检测到了你这个方法是在做第三方bean,或者是说你要配一个bean,它就认为你的形参它要给你提供,于是它就在容器中找这个类型的bean,找了有,如果我们将这个bean注掉的话,那结果是肯定找不到的👇👇。
注意
:引用类型注入只需要为bean定义方法设置形参即可,容器会根据类型自动装配对象
总结
以上就是我们
Spring注解开发
的全部内容,最后,如果有什么错误的话,大家可以私信我📬📬,希望大家多多关注+点赞+收藏 ^_ ^🙏🙏,你们的鼓励是我不断前进的动力💪💪!!!