Spring依赖注入和分析的三种方式根据Spring官网介绍,spring有两种注入方式1:构造函数注入2:Setter注入构造函数注入@ComponentpublicclassServiceB{publicServiceB(){System.out.println("B调用了构造函数");}}@ComponentpublicclassServiceA{privateServiceBserviceB;publicServiceA(ServiceBserviceB){System.out.println("serviceB被注入ServiceA");this.serviceB=serviceB;}}最终输出:B调用构造函数serviceB被注入ServiceA构造函数注入方式的前提是被注入对象(ServiceA)和被注入对象(ServiceB)都由Spring管理。当有多个构造函数时,Spring默认选择无参构造函数创建Bean,导致构造函数注入不成功。@ComponentpublicclassServiceA{privateServiceBserviceB;publicServiceA(){System.out.println("ServiceA构造函数创建!!!");}publicServiceA(ServiceBserviceB){System.out.println("serviceB注入到InServiceA中");this.serviceB=serviceB;}}@ComponentpublicclassServiceB{publicServiceB(){System.out.println("B调用了构造函数");}}输出结果ServiceA构造函数已创建!!!B调用构造函数2.Setter注入@ComponentpublicclassServiceA{privateServiceBserviceB;publicServiceA(){System.out.println("ServiceA构造函数创建!!!");}@AutowiredpublicvoidsetServiceB(ServiceBserviceB){System.out.println("serviceB注入");this.serviceB=serviceB;}}@ComponentpublicclassServiceB{publicServiceB(){System.out.println("B调用了构造函数");}}输出结果ServiceAconstructorcreated!!!B调用构造函数serviceB并在方法上注入@Autowired注解。可能会有疑问:方法上的@Autowired注解和字段上的注解有什么区别?我理解的注入方式和注入字段都可以称为setter注入。注解最后在方法上调用调用Method.invoke(object,args)来调用setXXX方法注入。注释最后在字段上调用??Filed.set(XXXX);3.@Lookup方法注入对于@Lookup修饰的方法,有相应的标准被子类重写和调用。如果是抽象方法,CGLIB的动态代理类会实现这个方法。如果不是抽象方法,就会重写这个方法。return-typeisfalse单例类型no-arguments不允许有参数。这个注解有点鸡肋,好像还没用过。包括一些常用的三方包都没有用到。当一个单例类(Singleton)注入一个原型类(prototype)时,单例类中的所有方法都会调用同一个原型类(prototype)实例.....大概等同于@ComponentpublicclassServiceA{@AutowiredprivateServiceBserviceB;publicintadd(inti){returnserviceB.add(i);}}@Component@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)公共类ServiceB{inti=1;publicintadd(intj){返回i=i+j;}}ServiceAserviceA=context.getBean(ServiceA.class);System.out.print(serviceA.add(1));System.out.print(serviceA.add(2));System.out.print(serviceA.添加(3));调用结果:247如果每次调用add()方法的对象实例都不同,则使用@Lookup。@ComponentpublicclassServiceA{publicServiceA(){System.out.println("ServiceA构造函数创建!!!");}@LookuppublicServiceBcreateServiceB(){返回空;}publicintadd(inti){ServiceBserviceB=createServiceB();返回serviceB.add(i);}}@Component@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)公共类ServiceB{inti=1;publicServiceB(){System.out.println("B调用了构造函数");}publicintadd(intj){returni=i+j;}}ServiceAserviceA=context.getBean(ServiceA.class);System.out.print(serviceA.add(1));System.out.print(serviceA.add(2));System.out.print(serviceA.添加(3));调用结果:B调用构造函数2B调用构造函数3B调用构造函数4调用@Lookup标识的方法大约等于直接从上下文中调用getBean()方法。
