Spring IOC(1)

Spring IOC

概念:

  • spring框架两大理念:IOC和AOP。具有低侵入低耦合,声明了事务管理,方便集成其他框架,降低开发难度等优点。

  • AOP:将核心业务功能和周边功能区分,使周边功能独立出来减少代码重复率和降低模块耦合度,并且具有较高的扩展性(权限控制,日志管理,事务管理等)

  • IOC(inverse of controller):翻转控制,简单的说就是将程序中手动创建对象的权利交给Spring框架
    在这里插入图片描述
    在这里插入图片描述

另一种描述:依赖注入DI,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。同一件事情的不同角度的描述,根本上就是引入IOC容器,利用依赖关系向容器里放Bean,实现对象间的解耦。

  • 好莱坞原则:不要打电话给我,我们会打电话给你。

拓:在好莱坞,把简历递交给演艺公司后就只有回家等待。由演艺公司对整个娱乐项的完全控制,演员只能被动式的接受公司的差使,在需要的环节中,完成自己的演出。

  • 好处:对象之间解耦;不需要理解类的具体实现,直接去ioc容器里面拿就好了

思考设计:

1.定义一个与配置文件对应的类bean

2.定义bean工厂接口及其实现类,解析配置文件,实例化

将实例化对象放到list中,再用一个map做注册,实现getBean()

3.实现获取Bean方法

  • 需要两个依赖
  <dependency>
      <groupId>dom4j</groupId>
      <artifactId>dom4j</artifactId>
      <version>1.6.1</version>
    </dependency>
    <dependency>
      <groupId>jaxen</groupId>
      <artifactId>jaxen</artifactId>
      <version>1.1.6</version>
  • 配置文件以及相应的bean

    <?xml version="1.0" encoding="UTF-8" ?>
    <beans>
        <bean id="userDao" class="org.example.dao.UserDao"></bean>>
        <bean id="userService" class="org.example.service.UserService"></bean>
    </beans>
    
    public class MyBean {
        private String id;
        private String clazz;
        //Constructor..
    	//set get..
        
    }
    
    
  • 工厂接口以及相应的实现类

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

public class MyClassPathXmlApplicationContext implements  BeanFactory{
    private List<MyBean> beanList;
    private Map<String,Object> beanMap=new HashMap<>();


    public MyClassPathXmlApplicationContext(String filename){
        this.parseXml(filename);
        this.instanceBean();
    }
    //解析配置文件得到List集合
    private void parseXml(String filename){
        //dom4j:获取解析器
        SAXReader saxReader = new SAXReader();
        URL resource = this.getClass().getClassLoader().getResource(filename);
        try{
            Document document = saxReader.read(resource);
            //xpath语法:获取beans下的所有bean
            XPath xPath = document.createXPath("beans/bean");
            //通过制定的格式解析文档对象
            List<Element> list = xPath.selectNodes(document);
            if(list!=null&&list.size()>0){
                beanList = new ArrayList<>();
                for(Element el:list){
                    String id = el.attributeValue("id");
                    String clazz = el.attributeValue("class");
                    MyBean myBean = new MyBean(id, clazz);
                    beanList.add(myBean);
                }
            }
            
        }catch (Exception e){
            e.printStackTrace();
        }

    }
    private void instanceBean(){
        if(beanList!=null&&beanList.size()>0){
            for(MyBean bean:beanList){
                String id=bean.getId();
                String clazz=bean.getClazz();
                try{
                    Object o = Class.forName(clazz).newInstance();
                    beanMap.put(id,o);
                }catch (Exception e){
                    e.printStackTrace();
                }
            }

        }
    }

    @Override
    public Object getBean(String id) {
        Object o = beanMap.get(id);
        return o;
    }
}
  • 测试
public class App 
{
    public static void main( String[] args )
    {
        BeanFactory beanFactory = new MyClassPathXmlApplicationContext("spring.xml");
        UserDao userDao = (UserDao) beanFactory.getBean("userDao");
        userDao.test();
        UserService userService = (UserService) beanFactory.getBean("userService");
        userService.test();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值