1、Spring简介
- Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。
2、Spring的优点
- spring是一个开源免费的框架。
- spring是一个轻量级的,非侵入式的框架
- 控制反转IOC,面向切面AOP
- 对事务的支持,对框架的支持
用一句话概括就是:Spring是一个轻量级的控制反转(IoC) 和面向切面(AOP) 的容器(框架)。
3、Spring之IoC
1、引例
IoC的本质,用一个例子来看
1.先创建一个空的项目
2.写一个技能Skill接口
public interface SkillDao {
public void getSkill();
}
3.再去写实现类
public class SkillDaoImpl implements SkillDao{
public void getSkill() {
System.out.println("获取技能名称!");
}
}
4.写SkillService的接口
public interface SkillService {
public void getSkill();
}
5.写SkillService的实现类
public class SkillServiceImpl implements SkillService {
private SkillDao skillDao = new SkillDaoImpl();
public void getSkill() {
skillDao.getSkill();
}
}
6.最后去测试一下
public class DemoTest {
@Test
public void test(){
SkillService skillService = new SkillServiceImpl();
skillService.getSkill();
}
现在把Skill的实现类加上几个
public class SkillTwoDaoImpl implements SkillDao{
public void getSkill() {
System.out.println("获取技能2的名称!");
}
}
public class SkillThreeDaoImpl implements SkillDao {
public void getSkill() {
System.out.println("获取技能3的名称!");
}
}
加上了获取技能2和技能3的实现类。如果我需要获取技能2的名称,那么我就要去Service对应的实现类去修改,只有少数到还好,但是一旦数量多了起来,这就显得非常恐怖了。每一次需要变动,都要去修改大量的代码,耦合性高,牵一发动全身,十分不方便。
现在想想如何去解决
可以不去实现它,留一个接口,用到再去实现。利用set方法。
去实现类中用set方法实现
public class SkillServiceImpl implements SkillService {
//private SkillDao skillDao = new SkillDaoImpl();
private SkillDao skillDao;
//写一个set方法
public void setSkillDao(SkillDao skillDao) {
this.skillDao = skillDao;
}
public void getSkill() {
skillDao.getSkill();
}
}
然后继续测试
public class DemoTest {
@Test
public void test(){
SkillServiceImpl skillService = new SkillServiceImpl();
skillService.setSkillDao(new SkillTwoDaoImpl());
skillService.getSkill();
//如果想获取技能3的名称,可以这样实现
skillService.setSkillDao(new SkillThreeDaoImpl());
skillService.getSkill();
}
- 现在已经发生了本质的变化。之前的东西都是由程序代码去创建,现在是调用者创建对象。就是说主动权已经到了调用者手中,程序已经不管对象的创建了。现在它只负责提供一个借口。
- 这是一种思想,程序不去管对象的创建,就可以更多的去关注其他业务的一些实现,这样做可以降低耦合性。此上就为Ioc的原型。
2、IoC本质
-
控制反转(Inversion of Control,缩写为IoC),就是一种设计思想。而依赖注入是实现IoC的一种方式之前没有IoC的程序中,对象的创建与对象间的依赖关系就是在程序中,对象的创建就是由程序控制。现在通过控制反转之后,将对象的创建交给了调用者。理解为获取依赖对象的方式反转了。
-
技术描述:
-
Class A中用到了Class B的对象b,一般情况下,需要在A的代码中显式的new一个B的对象。
采用依赖注入技术之后,A的代码只需要定义一个私有的B对象,不需要直接new来获得这个对象,而是通过相关的容器控制程序来将B对象在外部new出来并注入到A类里的引用中。而具体获取的方法、对象被获取时的状态由配置文件(如XML)来指定
-
-
IoC是Spring框架的核心,可以用很多方式去实现,比如xml配置或者注解Spring也可以零配置实现IoC
-
注:采用XML方式配置Bean的时候,Bean的定义信息是和实现分离的,而采用注解的方式可以把两者合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。
-
控制反转就是通过一定描述(XML文件或注解)并通过第三方去生产或者获取对象的方式。Spring中实现控制反转的是IoC容器,方式是DI(依赖注入)