问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

spring依赖注入使用的什么设计模式?27

发布网友 发布时间:2023-10-19 06:02

我来回答

4个回答

热心网友 时间:2024-12-04 13:12

  依赖注入模式

  依赖注入(Dependency Injection) 是一个非常简单的概念,伸手-等待。
  如例程1-1所示,Client依赖于抽象类型(甚至是具体类) IServer,蛋是(1)Client的类体中不创建IServer(子类)的对象,它不想自己创建IServer对象,而是提供public的构造器Client(IServer)或设置方法setIServer (IServer)等(伸手),(2)坐等外界将初始化后的IServer对象(的引用)传递进来(等待)。
  换言之,依赖注入模式是指客户类Client不用自己来初始化它所依赖的成员变量IServer,而是等待某个对象创建IServer的适当的(实现类)的对象并将它赋值给Client的成员变量。
  依赖注入的意义,在于保证Client仅仅与(通常是接口或抽象类)IServer耦合,而不与IServer的子类型耦合,这样的程序符合OCP或依赖于抽象类型原则。

  例程 1-1
  package creational;
  import java.lang.reflect.*; //也可以自己写
  import tool.God;
  public class Client{
  private IServer s;
  /**
  * 依赖注入
  */
  public Client(IServer s){
  this.s = s;
  }
  public void setS(IServer s){
  this.s = s;
  }
  public static void test(){
  //使用工具God
  IServer s = (IServer) God.create("1-5");
  s.m();
  }
  }

热心网友 时间:2024-12-04 13:13

springMVC通常采用属性注入的IOC方式和AOP织入方式相结合实现依赖注入
同时使用强制代理方式,代理类或者接口。
这里又涉及到单例模式(注入的类或者接口在容器中只存在一个)、工厂模式(通过反射实现类实例化过程的公用化)、楼上所说的装饰模式属于AOP织入的一部分。
想了解spring先从IOC和AOP开始吧。
一、单例模式案例:
一般Singleton模式通常有三种形式:
第一种形式: 也是常用的形式。
public class Singleton {
private static Singleton instance = null;
private Singleton(){
//do something
}
public static Singleton getInstance(){
if(instance==null){
instance = new Singleton();
}
return instance;
}
}
第二种形式:
public class Singleton {
//在自己内部定义自己的一个实例,只供内部调用
private static Singleton instance = new Singleton();
private Singleton(){
//do something
}
//这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance(){
return instance;
}
}
第三种形式: 双重锁的形式。
public class Singleton {
private static Singleton instance = null;
private Singleton(){
//do something
}
public static Singleton getInstance(){
if(instance==null){
synchronized(Singleton.class){
if(null == instance){
instance = new Singleton();
}
}
}
return instance;
}
}//这个模式将同步内容下方到if内部,提高了执行的效率,不必每次获取对象时都进行同步,只有第一次才同步,创建了以后就没必要了。
二、IOC通过单例模式+工厂模式的实现
抽象类
Java代码 
package com.factory;   
  
import com.singleton.Singleton;   
  
public abstract class AbstractFactory {   
  
    public abstract Singleton createSingleton();   
}  
工厂类
Java代码 
package com.factory;   
  
import com.singleton.Singleton;   
  
public class Factory extends AbstractFactory{   
  
    @Override  
    public Singleton createSingleton() {   
        return Singleton.getInstance();   
    }   
  
}  
单例类
Java代码 
package com.singleton;   
  
public class Singleton {   
  
    private static Singleton instance = null;   
       
    public Singleton(){   
           
    }   
       
    public static synchronized Singleton getInstance(){   
        if(instance == null){   
            instance = new Singleton();   
        }   
        return instance;   
    }   
       
    public String testSingleton(){   
        return "Hello Singleton";   
    }   
}  
测试类
Java代码 
package com.test;     
import com.factory.Factory;   
import com.singleton.Singleton;   
public class Test {        
    public static void main(String[] args){   
        Factory factory = new Factory();   
        Singleton s = factory.createSingleton();   
        System.out.print(s.testSingleton());   
    }   

三、代理案例
1.定义提供方法的接口
public interface IHello {
      
       public void hello(String name);
}
2.接口实现类
public class HelloSpeaker implements IHello {
 
       public void hello(String name) {
            
            System. out.println("实现类中的hello():" +"Hello " + name);
            
      }
}
3.定义静态代理类注入接口通过实现类实现方法
public class HelloProxy implements IHello {
       private IHello iHello ;
       public HelloProxy(IHello iHello) {
             super();
             this.iHello = iHello;
      }
       public void hello(String name) {
            System. out.println("代理类中的hello():" );
             iHello.hello(name);
      }
}
4.静态代理类测试main方法入口
public class ProxyDemo {
       public static void main(String[] args) {
            
            IHello iHello = new HelloProxy(new HelloSpeaker());
            
            iHello. hello("long");
            
      }
}
5.定义动态代理类减少代理类对接口的依赖
public class LogHandler implements InvocationHandler {
       private Object implClass ;
       public Object bind(Object implClass) {
            
             this.implClass = implClass;
            
             return Proxy.newProxyInstance(implClass.getClass().getClassLoader(),
                        implClass.getClass().getInterfaces(), this);
            
      }
       /**
       * 代理对象,这里面还可以改变原有的方法
       */
       public Object invoke(Object proxy, Method method, Object[] args)
                   throws Throwable {
            Object result = null;
             try {
                  System. out.println("添加日志" );
                  result = method.invoke( implClass, args);
            } catch (Exception e) {
                  e.printStackTrace();
            }
             return null ;
      }
}
6.动态代理类的测试主入口
public class ProxyDt {
       public static void main(String[] args) { 
            
           LogHandler logHandler = new LogHandler(); 
           IHello iHello = (IHello) logHandler.bind( new HelloSpeaker()); 
           iHello.hello( "long"); 
        
           }
}
四、利用ProxyFactory连接CGLIB简单实现AOP: 
加入包aopalliance.jar\cglib-nodep-2.1_3.jar demo:
view plaincopy to clipboardprint?
package cn.partner4java.proxy.proxyfactory;  
  
/** 
* 被代理的对象 
* @author partner4java 

*/  
public class MessageWriter {  
    public void writeMessage(){  
        System.out.println("world!");  
    }  
}  
package cn.partner4java.proxy.proxyfactory;  
  
import org.aopalliance.intercept.MethodInterceptor;  
import org.aopalliance.intercept.MethodInvocation;  
  
/** 
* 装饰者<br/> 
* MethodInterceptor接口是对方法调用连接点实现包围通知的AOP联盟标准接口 
* @author partner4java 

*/  
public class MessageDecorator implements MethodInterceptor{  
  
    public Object invoke(MethodInvocation invocation) throws Throwable {  
        System.out.print("Hello ");  
        Object retVal = invocation.proceed();  
        return retVal;  
    }  
  
}  
package cn.partner4java.proxy.proxyfactory;  
  
import org.springframework.aop.framework.ProxyFactory;  
  
/** 
* 调用组装 
* 这里最重要的部分是我们使用ProxyFactory来创建一个目标对象代理,同时织入通知  
* @author partner4java 

*/  
public class HelloWorldWeaver {  
  
    public static void main(String[] args) {  
        //目标  
        MessageWriter target = new MessageWriter();  
          
        //create the proxy  
        ProxyFactory proxyFactory = new ProxyFactory();  
          
        proxyFactory.addAdvice(new MessageDecorator());  
        proxyFactory.setTarget(target);  
          
        //获取返回被代理的目标  
        MessageWriter proxy = (MessageWriter) proxyFactory.getProxy();  
          
        target.writeMessage();  
        System.out.println("---");  
        proxy.writeMessage();  
//      后台打印:  
//      world!  
//      ---  
//      Hello world!  
    }  
  
}

热心网友 时间:2024-12-04 13:13

从上面代码可以看到,spring依赖注入时,使用了双重判断加锁的单例模式,首先从缓存中获取bean实例,如果为null,对缓存map加锁,然后再从缓存中获取bean,如果继续为null,就创建一个bean。这样双重判断,能够避免在加锁的瞬间,有其他依赖注入引发bean实例的创建,从而造成重复创建的结果。
在这里Spring并没有使用私有构造方法来创建bean,而是通过singletonFactory.getObject()返回具体beanName对应的ObjectFactory来创建bean。我们一路跟踪下去,发现实际上是调用了AbstractAutowireCapableBeanFactory的doCreateBean方法,返回了BeanWrapper包装并创建的bean实例。
(ObjectFactory主要检查是否有用户定义的BeanPostProcessor后处理内容,并在创建bean时进行处理,如果没有,就直接返回bean本身

热心网友 时间:2024-12-04 13:14

单例模式 工厂模式 装饰者模式 很多很多的....
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
水笔在手上画画会不会被衣服搽掉下来 老人每天大便次数很多量不多也不稀,每天还会拉三四次水应经三个月了... 从大连飞机场怎么去大连经济开发区5彩城K区的大连金港大酒店 除了打 ... 请问从大连周水子国际机场到经济技术开发区怎么走最省钱? 中国古代名刀总录中国古代十大名刀 怎样把qq安装到iphone里面 苏科大什么梗 苏科大叫什么名字 lol苏科大是苏州科技大学的吗 lol苏州科技大学为什么这么厉害 优尔精医用降温贴是不是保健品? 光盘上的“D9”(或D9光盘)是什么意思1 路由器上的TEST指示灯不亮,会不会影响网速? let it go有哪26语言9 身份证及户口本名字因迁出时派出所打错字,导致和毕业证上名字不一怎么办... 需要长春一个骨科诊所的电话 山东海岸线长度全国第几? 学籍卡丢了怎么办61 想配一台6000到7000的主机,大神有推荐的么? 自己买的钢化膜怎么贴?它里面有工具。求教程。有图更好。6 做什么工作能够接近明星?240 谁能告诉我什么工作可以离明星很近呢?19 从事哪些职业,可以去近距离追星呢?11 ...我就陪你等黄昏日落 你说清醒容易孤独 我就陪你酩酊大醉 你说黑夜... 微信有一个业务员加说:壹钱包先还平安普惠欠账再借款是不是真的?_百度... PLC中计数器怎么使用?1 怎么计算电源的额定功率啊71 人体对牛奶的吸收,一天最多能吸收多少? 我是想问我一天该...16 solidworks建模的时候怎么色泽不一样? 发现老公车里避孕套。我应该怎么办?12 请问一下,我大专证没下来可报名考初会计吗拿学号可 儒家 有关&quot;礼&quot;的阐释11 谁有微信电脑客户端给发一个6 女友我假如她怀孕了我该怎么办?是假如不是真怀孕了,避孕措施都... 跪求微信电脑客户端1 微信有没有电脑客户端微信电脑客户端啊 淘宝妞妞很牛代购店靠谱吗1 在淘宝上买的EVISU说是韩国代购的是正品吗?25 怎么补办学籍卡52 我想在淘宝网上买一件LEE的男士牛仔裤 有好的店吗 推荐一下4 老公车上发展避孕套,我该怎么办?6 求作业答案:海岸线长度和滩涂面积 山东省面积有多大? 小学学籍卡丢了怎么办啊!可以补办吗?25 ...考试了,但是发的那个点钞纸我怎么练都捻不开,怎么办啊? c2科目三考试直线加速行驶是不是在路口直行项目中进行 文件安装完后图标不显示是什么原因? 初一语文作文600字、、写父母、或老师、或同学、、、、、题目...116 为什么软件安装之后桌面不显示图标或图标是白色的9 西安323医院疼痛科刘义明大夫手机号 一天最多可以喝几盒牛奶?64