之前在看spring,看IOC实在是云里雾里,包括看AOP也是云里雾里的,后来重新学习Java Web,做了一个简单的web项目,再之后看了崔希凡老师的视频,Day27和Day28两天的内容,真的很有必要,很重要!

这里先说一下我对IOC控制反转的理解:

之前我们创建对象,都是通过new一个对象来生成的,比如:

Student st = new Student();

就调用构造器来进行对象的创建,但是有更好的方法,就是通过工厂方式来创建对象,具体的内容如下:

1.创建beans.xml文件并添加如下的配置:

<beans>
<bean id="stu1" className="cn.seu.domain.Student">
<property name="number" value="1001"/>
<property name="name" value="zhangSan"/>
<property name="age" value="29"/>
<property name="sex" value="male"/>
</bean>
</beans>

这就是一个Student类,其中所有的成员变量通过<property></property>标签来声明。

通过bean工厂创建对象:

BeanFactory bf = new BeanFactory(“beans.xml”);
Student s1= (Student)bf.getBean(“stu1”);

在beans.xml中添加<bean>标签中的scope属性,其中如果scope的值为singleton,就是单例模式,如果scope的值为prototype,就是多例模式。

2.如果希望实现两个对象有关联关系,在Property标签下可以添加ref标签来指示属性的值:

<bean id="stu1" className=" cn.seu.domain.Student ">
<property name="number" value="1001"/>
<property name="name" value="zhangSan"/>
<property name="age" value="29"/>
<property name="sex" value="male"/>
<property name="teacher" ref="t1"/><!-- ref的值必须是另一个been的id -->
</bean> <bean id="t1" className=" cn.seu.domain.Teacher">
<property name="tid" value="TEACHER_2001" />
<property name="name" value="liSi" />
<property name="salary" value="1234.56" />
</bean>

即在工厂中得到的对象已经完成了装配的功能.

3.但是上述这种domain下面的类往往不会通过这种方式来进行配置,这样的方式往往应用在Dao,Service和Action中。通过面向接口编程实现解耦。

在Dao包下创建Dao的接口,并创建该接口的两个实现类:

public interface StudentDao {
void add(Student stu);
void update(Student stu);
} public class StudentImpl implements StudentDao {
@Override
public void add(Student stu) {
System.out.println("StudentImpl.add()");
}
@Override
public void update(Student stu) {
System.out.println("StudentImpl.update()");
}
} public class StudentImpl2 implements StudentDao {
@Override
public void add(Student stu) {
System.out.println("StudentImp2.add()");
}
@Override
public void update(Student stu) {
System.out.println("StudentImp2.update()");
}
}

在beans.xml文件中进行配置:

<bean id="stuDao" className="cn.seu.dao.impl.StudentImpl1">
</bean>

如果想使用该接口的第二种实现方式只需要在配置文件中改变className的值即可:

<bean id="stuDao" className="cn.seu.dao.impl.StudentImpl2">
</bean>

在使用的时候只需要将得到的bean转换成该接口类型就可以实现对这两个对象的使用:

BeanFactory bf = new BeanFactory("beans.xml");
StudentDao stuDao = (StudentDao)bf.getBean("stuDao");
stuDao.add(null);
stuDao.update(null);

保证了换实现类的时候并不需要改变代码。直接调用接口中的方法。

4.同时在Service包下创建Service接口及其实现类:

原来我们在Service中首先要创建Dao对象,才能使用Dao中的方法,如:

Private StudentDao studentDao = new StudentDao();

但是通过BeanFactory可以不需要在其中创建,而是谁调用service方法,谁就需要先调用创建Dao的方法:

public interface StudentService {
void login();
} public class StudentServiceImpl implements StudentService {
private StudentDao studentDao = null;
// 谁调用service方法,谁就需要先调用本方法,提供dao
public void setStudentDao(StudentDao studentDao) {
this.studentDao = studentDao;
}
public void login() {
studentDao.add(null);
studentDao.update(null);
}
}

在配置文件中需要进行相关配置:

<bean id="stuDao" className="cn.itcast.dao.impl.StudentImpl2">
</bean> <bean id="stuService" className="cn.itcast.service.impl.StudentServiceImpl">
<property name="studentDao" ref="stuDao"/>
</bean>

即可实现装配。

上述就是我个人对于IOC所谓的将对象的创建和装配功能转交给容器来完成。

BeanFactory和IOC控制反转的更多相关文章

  1. Spring Boot笔记十:IOC控制反转

    目录 IOC控制反转和DI依赖注入 IOC实现Hello World Spring IOC容器怎么知道哪些是管理的对象? IOC容器getBean方法的三种签名 xml配置文件的import导入 @A ...

  2. Spring详解篇之IoC控制反转

    ###一.Spring概况 spring是一个开源框架 是一个轻量的控制反转和面向切面的容器框架 大小和开销都是轻量的. 通过控制反转技术可以达到松耦合的目的 切面编程,允许通过分离应用的业务逻辑. ...

  3. Spring源码——IOC控制反转

    1.基础知识 Spring有两个核心功能,分别是ioc和aop,其中ioc是控制反转,aop是切面编程. 在ioc中,还有一个名次叫DI,也就是依赖注入.嗯,好像IOC和DI是指同一个,好像又感觉他俩 ...

  4. Python实现IOC控制反转

    思路: 用一个字典存储beanName和资源 初始化时先将beanName和资源注册到字典中 然后用一个Dscriptor类根据beanName动态请求资源,从而实现控制反转 # -*- coding ...

  5. Spring专题2: DI,IOC 控制反转和依赖注入

    合集目录 Spring专题2: DI,IOC 控制反转和依赖注入 https://docs.spring.io/spring/docs/2.5.x/reference/aop.html https:/ ...

  6. 回顾Spirng ioc 控制反转

    Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的.结合网上对Spring Ioc的理解,回顾一下自 ...

  7. 谈谈php里的IOC控制反转,DI依赖注入

    理论 发现问题 在深入细节之前,需要确保我们理解"IOC控制反转"和"DI依赖注入"是什么,能够解决什么问题,这些在维基百科中有非常清晰的说明. 控制反转(In ...

  8. DI依赖注入/IOC控制反转

    DI依赖注入# 啥都不说,直接上代码 <?php class UserController { private $user; function __construct(UserModel $us ...

  9. IoC实践--用Autofac实现MVC5.0的IoC控制反转方法

    Autofac是一个.net平台下发性能还不错的IoC框架,利用它可以实现依赖注入和控制反转,使自己的软件模块之间的耦合性大大降低,让软件扩展.维护更加容易.控制反转(Inversion of Con ...

随机推荐

  1. [JAVA][Liferay] Configure sharding in multiple sites

    create databases first portal-ext.properties配置 hibernate.dialect=org.hibernate.dialect.PostgreSQLDia ...

  2. 在CentOS的profile文件中配置环境变量

    # idea jdk7 settings start #JAVA_HOME=/usr/local/jdk/jdk1.7.0_79 #JRE_HOME=$JAVA_HOME/jre #PATH=$PAT ...

  3. 解决浏览器窗口缩小出现白色背景的bug

    父容器上添加最小宽度min-width=xxxpx min-width的值大于浏览器横向滚动条出现时的宽度.

  4. [原创]Debian9 从零编译配置Redis4.0

    序言 Redis 一.准备工作 1.1 更新系统安装包列表 没啥,就他喵想用个最新的. # apt update 1.2 创建需要使用的目录 创建目录source和web,分别用来放源码和编译后的文件 ...

  5. Linux命令之查看日志等实时文件命令(less 、tail)使用

    一.less的使用 1)less  文件名,即可快速打开文件 2)相关查看搜索 3)利用键盘向上向下箭头键盘上的向上和向下箭头,点击一次向下简单,文件内容往下读取一行:点击一次向上箭头,文件内容,往上 ...

  6. Oracle三种循环例题:打印九九乘法表

    数据库SQL三种循环语句(For.While.Loop) --如果要将执行结果输出,需要先执行 setserveroutput on 命令,在窗口里显示服务器输出信息 set serveroutput ...

  7. 浩顺晶密K-5 打卡时间设置

    公司有一台浩顺晶密K-5打卡设备,因为时间异常需要重新调整,设备外部就几个按钮,全部按了一遍发现没有任何变化,所以肯定是哪里操作不对,然后用钥匙打开这个设置,上面有一排文字,分别是设置.+.-.确认等 ...

  8. MySQL入门很简单: 1 数据库概述

    1. 数据库概述 1.1 数据存储方式: 1)人工管理阶段 2)文件系统阶段: 文件系统通过文件的存储路径和文件名称访问文件中的数据 3)数据库系统阶段:Oracle, SQL Server, MyS ...

  9. POJ-3349 Snowflake Snow Snowflakes---最小表示法

    题目链接: https://vjudge.net/problem/POJ-3349 题目大意: 每个雪花都有六个分支,用六个整数代表,这六个整数是从任意一个分支开始,朝顺时针或逆时针方向遍历得到的.输 ...

  10. poj 2115 扩展欧几里得

    题目链接:http://poj.org/problem?id=2115 题意: 给出一段循环程序,循环体变量初始值为 a,结束不等于 b ,步长为 c,看要循环多少次,其中运算限制在 k位:死循环输出 ...