大家好,我是IT修真院深圳分院第5期学员,一枚正直善良的JAVA程序员。
今天给大家分享一下,修真院官网JAVA任务1中,SPRING框架IOC和DI.
一、背景介绍
Spring是一个基于IOC和AOP结构,J2EE系统的框架。IOC反转控制是Spring的基础,Inversion Of Control简单说就是创建对象由以前的程序员自己new构造方法来调用,变成了交由Spring创建对象;DI 依赖注入 Dependency Inject. 简单地说就是拿到的对象的属性,已经被注入好相关值了,直接使用即可。 AOP是任务五里面的内容,今天暂时不讲
二.知识剖析
一.Spring框架的组成
1.核心容器通过 IOC/DI(依赖注入)来实现容器对Bean的管理。这里最基本的概念是BeanFactory,它是任何Spring应用的核心。
2.Spring Context:提供了一种框架式的对象访问方法,Context封装包的特性得自于Beans封装包,applicationContext.xml是Spring的核心配置文件,通过关键字category即可获取Category对象,该对象获取的时候,即被注入了字符串"category 1“到name属性中
二.IOC和传统方式区别
1.传统的方式: 通过new 关键字主动创建一个对象
2.IOC方式 对象的生命周期由Spring来管理,直接从Spring那里去获取一个对象。 IOC是反转控制 (Inversion Of Control)的缩写,就像控制权从本来在自己手里,交给了Spring。
三。注入对象方式
1.setter getter方式(代码)
2.在applicationContext.xml 中要使用ref来注入另一个对象
四。注解常用词语
1.@Autowired,给这个测试类装配Category对象,可以自动帮你把bean里面引用的对象的setter/getter方法省略,它会自动帮你set/get
2.@Resource,作用和@Autowired一样的,但是要加一个赋值(name="category")
3.@Component,为Category 类加上@Component注解,即表明此类是bean;为Product类加上@Component注解,即表明此类是bean
五。applicationContext.xml配置文件
1.applicationContext.xml放置的位置
2.applicationContext.xml作用,通过关键词category即可获取Category对象,该对象获取的时候,即被注入了字符串"category 1“到name属性中
3.怎么用注解的方式进行配置
六。TestSpring测试类
通过spring获取Category对象,以及该对象被注入的name属性。 代码里打印出通过Spring拿到的Category对象的name属性
三.常见问题
1.spring中的BeanFactory与ApplicationContext的作用和区别?
2.什么是自动装配
四.解决方案
1. BeanFactory负责读取bean配置文档,管理bean的加载,实例化,维护bean之间的依赖关系,负责bean的声明周期。 2. ApplicationContext除了提供上述BeanFactory所能提供的功能之外,还提供了更完整的框架功能: 比如资源访问,事件传递,通过ApplicationContext扩展了ResourceLoader(资源加载器)接口。 3. ApplicationContext的初始化和BeanFactory有一个重大的区别:BeanFactory在初始化容器时,并未实例化Bean,直到第一次访问某个Bean时才实例目标Bean;而ApplicationContext则在初始化应用上下文时就实例化所有的单实例的Bean。因此ApplicationContext的初始化时间会比BeanFactory稍长一些.
2.Spring容器能够自动装配相互合作的bean,这意味着容器不需要construor-arg和property配置,能通过Bean工厂自动处理bean之间的协作
六、扩展思考
七、参考文献
张庆东师兄的PPT
八、更多讨论
@Autowired和@Resource的区别是什么
答:@Resource和@Autowired都是做bean的注入时使用,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入。
1、共同点
两者都可以写在字段和setter方法上。两者如果都写在字段上,那么就不需要再写setter方法。
2、不同点
(1)@Autowired
@Autowired为Spring提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired;只按照byType注入。
@Autowired注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用.
(2)@Resource
@Resource默认按照ByName自动注入,由J2EE提供,需要导入包javax.annotation.Resource。@Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不制定name也不制定type属性,这时将通过反射机制使用byName自动注入策略
详见视频
https://v.qq.com/x/page/a0533sllb9z.html腾讯视频
感谢大家观看
今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~
技能树.IT修真院
“我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,掌控自己学习的节奏,学习的路上不再迷茫”。
这里是技能树.IT修真院,成千上万的师兄在这里找到了自己的学习路线,学习透明化,成长可见化,师兄1对1免费指导。快来与我一起学习吧~
我的邀请码:19214843,
或者你可以直接点击此链接:http://www.jnshu.com/login/1/19214843
作者:kewangbuji
链接:
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。