Spring(春天),意为给软件行业带来了春天 他的前身是Interface21 Spring理念 : 使现有技术更加实用 . 本身就是一个大杂烩 , 整合现有的框架技术
Spring就是一个轻量级免费开源的面向切面(AOP)和控制反转(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)