1、之前:
-
UserDao 接口;
package com.beyond.dao; public interface UserDao { void getUser(); }
-
UserDaoImpl 实现类;
package com.beyond.dao; public class UserDaoImpl implements UserDao{ public void getUser() { System.out.println("默认获取用户信息"); } }
package com.beyond.dao; public class UserDaoMysqlImpl implements UserDao{ public void getUser() { System.out.println("Mysql获取用户信息"); } }
package com.beyond.dao; public class UserDaoOracleImpl implements UserDao{ public void getUser() { System.out.println("Oracle获取用户信息"); } }
-
UserService 业务接口;
package com.beyond.service; public interface UserService { void getUser(); }
-
UserServiceImpl 业务实现类;
package com.beyond.service; import com.beyond.dao.UserDao; import com.beyond.dao.UserDaoImpl; import com.beyond.dao.UserDaoMysqlImpl; import com.beyond.dao.UserDaoOracleImpl; public class UserServiceImpl implements UserService{ //=new UserDaoImpl(); //=new UserDaoMysqlImpl(); //=new UserDaoOracleImpl(); private UserDao userDao=new UserDaoImpl(); public void getUser() { userDao.getUser(); } }
-
测试;
import com.beyond.dao.UserDaoImpl; import com.beyond.dao.UserDaoMysqlImpl; import com.beyond.dao.UserDaoOracleImpl; import com.beyond.service.UserService; import com.beyond.service.UserServiceImpl; public class MyTest { public static void main(String[] args) { //用户调用的是业务层 UserService userService = new UserServiceImpl(); userService.getUser(); } }
-
缺点:如果工程代码大,就要改大量的代码,不是一个优秀的代码!
2、改进:
-
UserDao 接口;
package com.beyond.dao; public interface UserDao { void getUser(); }
-
UserDaoImpl 实现类;
package com.beyond.dao; public class UserDaoImpl implements UserDao{ public void getUser() { System.out.println("默认获取用户信息"); } }
package com.beyond.dao; public class UserDaoMysqlImpl implements UserDao{ public void getUser() { System.out.println("Mysql获取用户信息"); } }
package com.beyond.dao; public class UserDaoOracleImpl implements UserDao{ public void getUser() { System.out.println("Oracle获取用户信息"); } }
-
UserService 业务接口;
package com.beyond.service; public interface UserService { void getUser(); }
-
UserServiceImpl 业务实现类;
package com.beyond.service; import com.beyond.dao.UserDao; public class UserServiceImpl implements UserService{ private UserDao userDao; //利用set动态实现值的注入 public void setUserDao(UserDao userDao){ this.userDao=userDao; } public void getUser() { userDao.getUser(); } }
-
测试;
import com.beyond.dao.UserDaoImpl; import com.beyond.dao.UserDaoMysqlImpl; import com.beyond.dao.UserDaoOracleImpl; import com.beyond.service.UserService; import com.beyond.service.UserServiceImpl; public class MyTest { public static void main(String[] args) { //用户调用的是业务层 UserService userService = new UserServiceImpl(); /*改进后,程序员只需修改测试的代码 new UserDaoImpl() new UserDaoMysqlImpl() new UserDaoOracleImpl() */ ((UserServiceImpl) userService).setUserDao(new UserDaoOracleImpl()); userService.getUser(); } }
-
这是IOC的原型:程序员不用再去管理对象的创建了,系统的耦合性大大降低,可以更加专注在业务层的实现上!
3、IOC本质
**控制反转IOC(Inversion of Control),是一种设计思想,DI(依赖注入)实现IOC的一种方法。**没有IOC的程序中,我们使用面向对象编程,对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建有程序自己控制,控制反转后将对象的创建移给第三方,个人认为所谓控制反转就是:获得依赖对象的方式反转了。
IOC时Spring框架的核心内容,使用多种方式完美地实现了IOC,可以使用XML配置,也可以使用注解,新版本的Spring也可以零配置实现IOC。
Spring容器在初始化时先读取配置文件,根据配置文件或元数据创建与组织对象存入容器中,程序使用时再从IOC容器中取出需要的对象。
采用XML方式配置Bean的时候,Bean的定义信息是和实现分离的,而采用注解的方式可以把两者合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到零配置的目的。
控制反转是一种通过描述(XML或注解)并通过第三方其生产或获取特定对象的方式。在Spring中实现控制反转的是IOC容器,其实现方法是依赖注入(Dependency Injection,DI)。
4、helloSpring
控制:传统应用程序的对象是由程序本身控制创建的,使用Spring后,对象由Spring创建。
反转:程序本身不创建对象,而是被动的接受对象。
依赖注入:就是利用set方法来进行注入的。
IOC:是一种编程思想,主动的变成变成被动的接收。
-
编写实体类;
package com.beyond.pojo; public class Hello { private String str; public String getStr() { return str; } public void setStr(String str) { this.str = str; } @Override public String toString() { return "Hello{" + "str='" + str + '\'' + '}'; } }
-
编写beans.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 https://www.springframework.org/schema/beans/spring-beans.xsd"> <!--使用Spring来创建对象,在Spring里面这些都称为Bean 类型 变量名=new 类型(); Hello hello=new Hello(); id:变量名 class:new的对象 <property name="str" value="Spring"/>相当于给对象中的属性赋一个值 --> <bean id="hello" class="com.beyond.pojo.Hello"> <property name="str" value="Spring"/> </bean> </beans>
-
测试。
import com.beyond.pojo.Hello; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MyTest { public static void main(String[] args) { //获取Spring的上下文对象 ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); //我们的对象现在都在Spring中管理了,我们要使用,直接去里面取出来就可以了 Hello hello = (Hello)context.getBean("hello"); System.out.println(hello.toString()); } }
思考:
- hello对象是谁创建的?——hello对象是由Spring创建的。
- hello对象的属性是谁设置的?——hello对象的属性是由Spring容器设置的。