Spring之旅
什么是Spring?
Spring(春天),意为给软件行业带来了春天
他的前身是Interface21
Spring理念 : 使现有技术更加实用 . 本身就是一个大杂烩 , 整合现有的框架技术
Spring就是一个轻量级免费开源的面向切面(AOP)和控制反转(IOC)的框架(容器)
理解IOC(控制反转)
从代码层面理解
新建一个Maven项目---->创建一个Dao包和Service包,里面有它们的接口和具体实现类
1.创建一个dao接口
public interface UserDao {
public void getUser();
}
它的实现类
public class UserDaoImp implements UserDao {
public void getUser() {
System.out.println("获取用户数据");
}
}
2、创建一个Service接口及它的实现类
public interface UserService {
public void getUser();
}
public class UserServiceImp implements UserService{
UserDao userDao=new UserDaoSqlSeverImp();
public void getUser() {
userDao.getUser();
}
}
测试
@Test
public void test() {
UserServiceImp userServiceImp=new UserServiceImp();
userServiceImp.getUser();
}
想象一下此时我们如果把UserDao的实现类增加几个,
public class UserDaoMysqlImp implements UserDao {
@Override
public void getUser() {
System.out.println("Mysql获取数据");
}
}
public class UserDaoSqlSeverImp implements UserDao{
@Override
public void getUser() {
System.out.println("Sqlsever获取数据");
}
}
此时我们需要去Service里修改对应实现类,假设我们的这种需求非常大 , 这种方式就根本不适用了, 甚至反人类对吧 , 每次变动 , 都需要修改大量代码 . 这种设计的耦合性太高了, 牵一发而动全身 .
那么我们如何解决????
我们可以在需要用到他的地方 , 不去实现它 , 而是留出一个接口 , 利用set , 我们去代码里修改下 .
public class UserServiceImp implements UserService{
UserDao userDao=new UserDaoSqlSeverImp();
public void getUser() {
userDao.getUser();
}
public void setUserDao(UserDao userDao) {
this.userDao=userDao;
}
}
测试:
@Test
public void test1() {
UserServiceImp userServiceImp=new UserServiceImp();
userServiceImp.setUserDao(new UserDaoMysqlImp());
userServiceImp.getUser();
userServiceImp.setUserDao(new UserDaoOracleImpl());
userServiceImp.getUser();
userServiceImp.setUserDao(new UserDaoSqlSeverImp());
userServiceImp.getUser();
}
我们发现第二种方式是由我们自行控制创建对象,把主动权交给了调用者,程序不用管怎末去创建,只负责提供一个接口就可。
IoC 是指在程序开发中,实例的创建不再由调用者管理,而是由 Spring 容器创建。Spring 容器会负责控制程序之间的关系,而不是由程序代码直接控制,因此,控制权由程序代码转移到了 Spring 容器中,控制权发生了反转,这就是 Spring 的 IoC 思想。
控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Dependency Injection,DI)