- 自制简易版SpringIOC
- Spring简介
- 无IOC存在问题
- 案例搭建
- 案例描述
- IOC控制反转
- 概述
- 自制简易版IOC
- 准备工作
- 核心代码
- 启动
spring是一个开源框架,为了解决企业应用开发的复杂性而创建.是javaEE的开发框架,核心为**IOC控制反转,DI依赖注入,AOP面向切面,**还有一个优点是非常方便整合其他框架,无侵入的进行功能增强
无IOC存在问题 案例搭建案例项目结构:
- 启动类
public class Demo {
public static void main(String[] args) {
UserService userService = new UserServiceImpl();
System.out.println(userService.findUserById(1));
}
}
2.service接口
public interface UserService {
User findUserById(int id);
String findUserName(int id);
}
3.service实现类
public class UserServiceImpl implements UserService {
UserDao userDao = new UserDaoImpl2();
@Override
public User findUserById(int id) {
return userDao.findUserById(1);
}
@Override
public String findUserName(int id) {
return userDao.findUserName(12);
}
}
4.dao接口
public interface UserDao {
User findUserById(int id);
String findUserName(int id);
}
5.dao实现类
这里有两个实现类,来模拟后面业务逻辑发生改变
public class UserDaoImpl1 implements UserDao {
@Override
public User findUserById(int id) {
return new User(id,"springUser1");
}
@Override
public String findUserName(int id) {
return "spring1";
}
}
public class UserDaoImpl2 implements UserDao {
@Override
public User findUserById(int id) {
return new User(id,"springUser2");
}
@Override
public String findUserName(int id) {
return "spring2";
}
}
案例描述
当业务逻辑发生改变时Dao层的实现类由UserDaoImpl1变为了UserDaoImpl2,这时就需要在service层改变调用接口,useService与userDao有高耦合度,在实际项目中,其实有很多service层与Dao层有高耦合度,这时接口改变,导致调用接口也需要改变,耦合度过高导致项目改动较为复杂
spring可以巧妙的避免这种情况,也就是spring中的核心功能IOC
IOC控制反转 概述使用A对象之前我们需要创建和封装对象,而引入现在这些创建和封装都交给Spring容器来帮我们解决,只需要去spring容器中查询需要使用的对象;这个过程A对象的创建和组装过程反转,所以为控制反转,IOC是面向对象编程中的一个设计原则,主要是降低了系统代码的耦合度
自制简易版IOC 准备工作创建xml文件
<bean class="com.lsy.dao.impl.UserDaoImpl1" id="userDao">bean>
核心代码
public class ClassPathXmlApplicationContext {
/*定义对象容器*/
private static HashMap<String, Object> beanMap = new HashMap<>();
private String path;
/*对象初始化*/
public ClassPathXmlApplicationContext(String path) {
this.path = path;
load();
}
public void load() {
try {
String filePath =
ClassPathXmlApplicationContext
.class.getClassLoader()//获取类加载器
.getResource(path)//获取文件类名地址
.getPath();
filePath = URLDecoder.decode(filePath, "utf-8");//设置文件名编码格式
Document document = Jsoup.parse(new File(filePath),"utf-8");
Elements beans = document.getElementsByTag("bean");
if (beans!=null&&beans.size()>0){
//遍历所有bean标签
for (int i = 0; i < beans.size(); i++) {
Element element = beans.get(i);
String className = element.attr("class");
String id = element.attr("id");
/*通过全类名反射创建对象*/
Class<?> aClass = Class.forName(className);
Constructor<?> constructor = aClass.getConstructor();
Object o = constructor.newInstance();
//将创建的对象放入容器
beanMap.put(id,o);
}
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public Object getBean(String id){
return beanMap.get(id);
}
}
启动
成功创建对象,这样就可以解决耦合度过高问题,当接口发生改变时,只需改动xml配置文件
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)