SpringIOC

一、基本使用流程代码实现

1.1 导包

图片说明

1.2 在src下配置applicationcontext.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    //<!--配置资源对象-->
    <bean id="myService" class="com.service.impl.MyServiceImpl2"></bean>
</beans>

在xml中配置<id,class>的键值对,class对应具体Service的相对路径,当需要对现有的Service维护更新时,只需要在xml文件中修改class的值而不需要对源代码进行修改

1.3 在代码中获取Spring容器中的对象

//获取Spring容器对象
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationcontext.xml"); //配置文件名
final MyService myService = (MyService) ac.getBean("myService"); //"myService"为<id,class>键值对中的id
myService.testService(); //调用Service中的方法

二、SpringIOC创建对象的三种方式

在学习了SpringIOC的基本使用流程后,我们使用IOC解耦层与层之间的逻辑关系,但是我们发现,对象由以前我们自己根需求在代码中直接new创建为从Spring容器中获取,也就说对象的创建由Spring容器来创建,我们直接获取使用即可,那么,如果我们需要一个带有指定的初始化数据的对象,如何
让Spring容器对象帮我们创建呢?

2.1 通过构造器方式

  1. 无参构造器:Spring容器默认使用无参构造方式创建对象
  2. 有参构造器:
//<!--无参构造-->
<bean id="student" class="com.pojo.Student"></bean>
//<!--有参构造-->
<bean id="student01" class="com.pojo.Student">
    <constructor-arg index="0" name="name" type="java.lang.String" value="张三"></constructor-arg>
    <constructor-arg index="1" name="age" type="java.lang.Integer" value="25"></constructor-arg>
</bean>

index:形参的下标
name:形参的名字
type:形参类型(全路径)
value:形参的值
注意:xml文件中对象的所有构造方法都会在创建Spring容器时执行

2.2 通过属性注入方式

相当于先创建一个空对象,然后调用set方法完成属性的赋值

<bean id="student02" class="com.pojo.Student">
    <property name="name" value="李四"></property>
    <property name="age" value="22"></property>
</bean>

name:形参的名字
value:形参的值
注意:必须提供对象的set方法

2.3 通过工厂模式

传统方案:我们自己创建工厂,然后调用工厂创建对象的方法,获取生产的对象。
IOC方案:Spring容器创建工厂,并自动调用其创建的工厂的生产对象的方法,生产的对象直接存储在Spring容器中,我们直接从Spring容器中获取对象。

//<!--通过工厂创建对象-->
//<!--动态工厂-->
<bean id="studentFactory" class="com.pojo.StudentFactory"></bean>
<bean id="student03" factory-bean="studentFactory" factory-method="newIntance"></bean>
//<!--静态工厂-->
<bean id="student04" class="com.pojo.StudentStaticFactory" factory-method="newIntance"></bean>

1.动态工厂:
class:动态工厂全路径
factory-bean:动态工厂id
factory-method:动态工厂方法
2.静态工厂:
class:静态工厂全路径
factory-method:静态工厂方法

三、IOC的依赖注入DI

3.1 对象之间的依赖关系

我们在设计类对象时,会在类中声明其他类类型的属性,来调用其他类的资源完成当前类的功能处理,比如A类中声明B属性,在A类中就可以直接调用B
类的资源完成A类的功能开发,但是A对象被创建时,其B属性必须有值,否则空指针异常,我们将此种也就是A和B的关系称为对象之间的依赖关系(A依赖B).

3.2 依赖责任链

对象之间项目依赖形成的一条链式依赖关系.
D d = new D();
C c = new C(d);
B b = new B(c);
A a = new A(b);
A<---B<----C<----D

3.3 解决方案及代码实现

解决:让Spring容器根据对象之间的依赖关系,将依赖责任链上的所有对象全部配置为Bean对象,并且根据依赖关系完成对象之间的组装,将组装好的对象返回给用户使用。
代码实现

//<!--依赖注入-->
//<!--构造器方式-->
<bean id="student05" class="com.pojo.Student01">
    <constructor-arg index="0" name="name" type="java.lang.String" value="王五"></constructor-arg>
    <constructor-arg index="1" name="age" type="java.lang.Integer" value="30"></constructor-arg>
    <constructor-arg index="2" name="teacher" type="com.pojo.Teacher" ref="tea"></constructor-arg>
    //属性值为某个对象时,用ref赋值,值为该Bean对象的id
</bean>
<bean id="tea" class="com.pojo.Teacher">
    <property name="name" value="黎老师"></property>
    <property name="age" value="21"></property>
</bean>
//<!--属性注入方式-->
<bean id="student06" class="com.pojo.Student01">
    <property name="name" value="赵六"></property>
    <property name="age" value="28"></property>
    <property name="teacher" ref="tea"></property> //属性值为某个对象时,用ref赋值,值为该Bean对象的id
</bean>

ref:属性值为某个对象时,用ref赋值,值为该Bean对象的id

全部评论

相关推荐

拉哥聊校招:1.大厂看中的是计算机基础,项目的深度和思考,以及你对技术栈应用在你的项目的业务的思考,以及高并发(以Java为例嘛,就是JUC的掌握),数据库缓存这些。上述掌握了 也需要很长时间的,而且大部分人掌握的还是八股,但校招来说也是够了~(当然小厂一般看中你的上手能力,也就是所谓的“技术”嘛,能写接口也可以了),至于项目这块,因为大多数人都是烂大街项目嘛,所以你需要对于你写的项目需要体现你的思考才是,这些才是你的亮点所在。(前提是进入面试) 2.因为面试官几乎就是看三个模块,一个是实习经历(包括科研经历,假如有的话),一个是项目经历,一个是技能;三个模块的排序就看你对哪个掌握比较深,哪个更深,更有自信就将该模块放在前面。 3.专业技能你写的熟悉,是否真的熟悉,所谓的熟悉是你应用场景、原理都要很懂才叫熟悉,不然的话你经不住面试官拷打很减分的;或许可以考虑换一个说法。技能这块最好是罗列一下,清晰地按照模块分层写:语言及基础、框架、中间件、计算机基础等;(不过你分层写的不错) 4.项目这块最好按照STAR法则去写,按照按照四个模块,项目描述,项目使用的技术栈,项目难点亮点(可以适当加粗),项目做完的收获这样子。我们都知道大部分同学的项目都是烂大街的,这其实没所谓,哪有那么多同学做高并发的项目呢哈哈,很多大厂里面的员工也只是负责 toB 业务的他们也不知道高并发呀~所以,重点在于你对你写的项目的深度思考,你在面对什么相对复杂的业务时用了啥技术去解决?这个技术是否经过验证?权衡?以及带来的后果是啥,浓缩成一句话,你要把你的项目当成要还原一个现成的app去写最好。你是否准备对项目的难点亮点的问题呢?项目问题你这边虽然都是技术栈堆砌,但是问题不大了,整天看起来还是可以的(这边可以给你简历的项目提一些面试官或许会问的问题或者拓展问题) 5.学历很优秀,完全有可能去大厂的呀,现在是秋招提前批和日常实习的专场了,可以好好准备一下,然后充提前批吧~做一个简介:假如需要模拟面试,可以来滴滴我哈哈,一般两次到三次模拟面试就可以避免踩坑了(再强的面霸第一次面试的时候都是做炮灰的,很多学历很好的同学的第一面往往是大厂面试,做炮灰的几率更大,因为小厂也不傻,不给机会面试,所以我们可以给你一次模拟面试,让你真正掌握面试的重点的技巧,而不只是单单背八股文而已~以及包括项目的亮点和难点辅导),简历辅导也是如此。 6.最后的最后,加油努力,祝你成功、顺利。
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务