Spring之IOC详解

作者:小破孩123 时间:2022-10-13 19:10:24 

学过Spring的小伙伴对于IOC一定不陌生,IOC:控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心。 控制反转一般分为两种类型,依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup)。依赖注入应用比较广泛。本篇我们通过一个实例和大家简单分析一下Spring中IOC的原理,以便我们可以更好的理解Spring。

简单描述一下我们的场景,添加新用户到数据库,这里我们采用分层的方式,进行功能的实现,我们知道,开发程序一定要注意程序的可移植性,所以这里简单为大家介绍一下面向接口编程,面向接口编程就是面向抽象编程、面向规范编程,它带来的最大的好处便是解耦、增强扩展性、屏蔽变化。

Spring之IOC详解

好了下面我们开始我的业务实现,首先我们需要创建一个Model--UserDO.java


public class UserDO {
private String name;
private String password;
public String getName() {
 return name;
}
public void setName(String name) {
 this.name = name;
}
public String getPassword() {
 return password;
}
public void setPassword(String password) {
 this.password = password;
}
}

有了我们的用户对象,下面我们开始创建Selvect类,Selvect我们知道,使用了接收用户请求的对象,这里因为我们只是为了方便大家理解,所以我们在Selvect中模拟收到用户请求后进行相关业务逻辑处理:


public class UserSelvect {
public static void main(String[] args) {
 UserDO userDO = new UserDO();
 BeanFactory beanFactory = new ClassPathXmlApplicationContext();//创建我们的Bean工厂
 UserService userService = (UserService) beanFactory.getBean("userService");//通过类名来获得类对象
 userService.add(userDO);//完成业务逻辑
}
}

一般我们的业务逻辑会放在Service层进行操作,所以我能先来看一下我们的Service对象:


public class UserService {
private UserDao userDao;//实例DAO对象
public UserDao getUserDao() {
 return userDao;
}
//用于Bean工厂中进行DAO动态绑定
public void setUserDao(UserDao userDao) {
 this.userDao = userDao;
}
//用于Selvect对象调用,进行业务逻辑处理
public void add(User u){
 userDao.add(u);
}
}

下面就是我们的DAO层的实现了,这里就要说明了,为了最大化提高程序的可移植性,接下来将采用接口编程的实现进行设计:


/**
* DAO类只有方法定义
* 从而减低程序直接的耦合
*/
public interface UserDao {
public void add(User u);
}

既然是面向接口编程,就一定需要实现接口的类:


public class UserDaoImpl implements UserDao{
public void add(User u){
 System.out.println("保存一个学生对象");
}
}

好了到这里我们的基本框架已经完成,接下来就要开始重点的内容了,首先我们需要先了解一些关于xml解析的知识,在之前的博客中已经为大家介绍了过一种方式:Jdom读取XML文件,不了解的小伙伴可以先移步简单查看一下,这样接下来的内容,你才不至于感到吃力。下面我们进行我们的这个Demo的设计,首先在src目录下添加一个Spring.xml文件:


<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean id="userDao" class="com.manyiaby.daoimpl.UserDaoImpl"></bean>
<bean id="userService" class="com.manyiaby.service.UserService">
 <property name="userDao" bean="userDao"></property>
</bean>
</beans>

下面我们定义一个Bean工程对象,用来读取我们的Spring.xml文件,从而完成对象实例的创建,一便接下来的业务操作:


public interface BeanFactory {
public Object getBean(String className);
}

大家是不是发现我们的Bean工场也是采用接口编程的思想,接下来看一下我们的工场实现类:


public class ClassPathXmlApplicationContext implements BeanFactory{
private Map<String, Object> beanMap = new HashMap<String, Object>();//用来存配置文件中的类对象
public ClassPathXmlApplicationContext(){
 try {
  SAXBuilder saxBulder = new SAXBuilder();
  Document doc = saxBulder.build(ClassPathXmlApplicationContext.class
    .getClassLoader().getResourceAsStream("spring.xml"));
  Element root = doc.getRootElement();//获取根元素
  List<Element> list = root.getChildren("bean");
  for (Element element : list) {
   String id = element.getAttributeValue("id");//得到beanId
   String className = element.getAttributeValue("class");//得到Bean的类名地址
   System.out.println(className);
   Object object = Class.forName(className).newInstance();
   beanMap.put(id, object);
   if (null != element.getChild("property")) {
    Element property = element.getChild("property");
    String name = property.getAttributeValue("name");
    String beanId = property.getAttributeValue("bean");
    Object beanObject = beanMap.get(beanId);//UserDaoImpl
    String methodName = "set" + name.substring(0, 1).toUpperCase() + name.substring(1);//setUserDao
    System.out.println(methodName);
    Method m = object.getClass().getMethod(methodName, beanObject.getClass().getInterfaces()[0]);//UserService的SetUserDao()方法,接收的参数为UserDao接口类
    m.invoke(object, beanObject);//调用UserService的SetUserDao()方法,传入UserDaoImpl
   }
  }
 } catch (Exception e) {
  System.out.println("" + e);
 }
}
//用于类调用
@Override
public Object getBean(String className) {
 return beanMap.get(className);
}
}

简单为大家介绍一下,我们通过beanMap将我们在Spring中配置的对象,通过反射机制拿到,然后放置于beanMap对象中,通过getBean方法,共外部类调用。

上面简单模拟了一下Spring中IOC的一些内容,下面咱们一起来看一下,如何通过Spring完成上面的操作,首先我们需要下载spring.jar,有了这个jar还不够,spring还依赖commons-logging.jar,好了将这两个jar包导入到我们的工程中,然后我们就来看一下如何实现使用:


public class UserSelvect {
public void main() {
 UserDO userDO = new UserDO();
 BeanFactory beanFactory = new ClassPathXmlApplicationContext("spring.xml");
 UserService userService = (UserService) beanFactory.getBean("userService");
 //ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
 //UserService userService = (UserService) context.getBean("userService");
 userService.add(userDO);
}
}

其他不用修改,是不是很简单,好了,关于Spring的内容为大家介绍到这里。

希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持脚本之家!

来源:http://www.cnblogs.com/AndroidJotting/p/6581452.html

标签:spring,ioc
0
投稿

猜你喜欢

  • 关于cron表达式每天整点执行一次的问题

    2023-06-24 13:51:27
  • Java Swing null绝对布局的实现示例

    2021-07-27 06:07:18
  • 基于Silverlight DataGrid中无代码设置开始与结束日期DatePicker的实现方法

    2023-05-04 16:34:50
  • android 全屏去掉底部虚拟导航栏的方法

    2021-06-22 12:23:26
  • java.lang.NoSuchMethodException: com.sun.proxy.$Proxy58.list错误解决办法

    2021-05-25 03:11:19
  • C#利用VS中插件打包并发布winfrom程序

    2022-01-01 21:18:22
  • Java代码优化细节

    2023-06-26 09:34:34
  • Android从服务器获取图片的实例方法

    2022-08-27 04:03:46
  • Spring Boot Maven Plugin打包异常解决方案

    2022-04-17 11:23:41
  • 使用JMF实现java视频播放器

    2022-12-26 00:28:25
  • 面试官:Java中new Object()到底占用几个字节

    2022-02-09 19:04:00
  • C#集合查询Linq在项目中使用详解

    2022-09-16 13:50:09
  • 详解Java Map中三个冷门容器的使用

    2021-09-02 14:27:22
  • mybatis中mapper-locations的作用

    2023-11-10 18:02:58
  • Java获取视频时长、大小的示例

    2023-01-16 01:48:44
  • 详解java.lang.reflect.Modifier.isInterface()方法

    2023-07-27 18:25:25
  • 基于Java实现的图的广度优先遍历算法

    2021-06-02 06:51:20
  • C#中DateTime日期类型格式化显示方法汇总

    2021-07-20 15:52:30
  • Android中利用matrix 控制图片的旋转、缩放、移动

    2023-01-12 12:35:01
  • C# 邮件发送和接收实现代码

    2021-11-23 03:32:36
  • asp之家 软件编程 m.aspxhome.com