spring经典笔记(部分内容来自一个技术公众号整合了自己的理解)

来源:互联网 发布:java math 生成随机数 编辑:程序博客网 时间:2024/06/07 09:20
个人看spring文章后对spring的理解


一:另外从Spring容器的角度来看,Spring容器负责将被依赖对象赋值给调用者的成员变量——相当于为调用者注入它依赖的实例,
因此Martine Fowler称之为依赖注入。如下所示A中某个功能依赖B的对象来实现,传统获取B的对象都是A类主动获取B类对象,要么直接new
或者调用B类的工厂方法get一个B的对象,这两个过程都是强调主动,而spring现在不在主动,而是通过Spring容器负责将被依赖对象赋值给调用者,调用者被动接收
这个对象来调用相关方法实现相应功能。所以称作依赖注入,依赖的是spring的容器来分配给它对象。而获取对象的过程从主动变为了被动,所以称为控制反转,以前对象主动去拿,现在被动接收,权限反转,所以依赖注入又成为控制反转。以前主动获取时调用者与被依赖对象实现类的硬编码耦合,非常不利于项目升级的维护。
而这种依赖注入的对象呢分两种方法注入到调用类中。


 public class A{


       private B b;
    
   }


设值注入(byName: 根据setter方法名进行自动装配)


设值注入是指IoC容器通过成员变量的setter方法来注入被依赖对象。这种注入方式简单、直观,因而在Spring的依赖注入里大量使用。
xml中配置:
        <bean name="a" class="A">
     <property name="b" ref="b" />
</bean>


public class A{


       private B b;


       public void setB(B b){
            this.b=b;
          }
    
   }


构造注入


利用构造器来设置依赖关系的方式,被称为构造注入。通俗来说,就是驱动Spring在底层以反射方式执行带指定参数的构造器,当执行带参数的构造器时,就可利用构造器参数对成员变量执行初始化——这就是构造注入的本质。
xml中配置:
        <bean name="a" class="A">
     <constructor-arg name="b" ref="b" />
</bean>




 public class A{


       private B b;


       public A(B b){
            this.b=b;
          }
    
   }




二:spring如果使用注解来实例化bean,注入当前类,那么它所依赖的其它对象的注入也是差不多和上面说的一样,只是稍微有点不一样的地方。
(1)不使用注解的情况两种方式的注入上面已经说明,下面我们说使用注解的情况,使用自动扫包注解可以省去xml中bean的配置。


1.如果我们xml省去调用类controller类(A)中的bean,对被调用类(B)还是xml中配置了bean 那么如下面的描述


setter方法注入:我们不再需要下面这个
xml中配置:
        <bean name="a" class="A">
     <property name="b" ref="b" />
</bean>


直接在调用对象内部给被调用的成员变量上面  或者   setter方法上加注解即可,setter方法上或者属性上我们用@Autowired和 @Resource效果一样,


只是@Autowired默认byType: 
根据setter方法的形参类型或者成员变量类型来自动装配。Spring容器查找容器中的全部Bean,如果正好有一个Bean类型与setter方法的形参类型或者成员变量类型匹配,
就自动注入这个Bean;如果找到多个这样的Bean,就抛出一个异常;如果没有找到这样的Bean,则什么都不会发生,setter方法不会被调用;


@Resource默认byName: 
根据setter方法名或者成员变量名进行自动装配。Spring容器查找容器中全部Bean,找出其id与setter方法名去掉set前缀,并小写首字母或者与成员变量名同名的Bean
来完成注入。如果没有找到匹配的Bean实例,则Spring不会进行任何注入;




@Controller
public class A{
        @Resource
       private B b;


        public void setB(B b){
            this.b=b;
          }
   }




@Controller
public class A{
       private B b;
        @Resource
        public void setB(B b){
            this.b=b;
          }
   }






构造方法注入:我们不再需要下面这个:
        <bean name="a" class="A">
     <constructor-arg name="b" ref="b" />
</bean>




直接在调用对象内部给被调用的成员变量上面  或者   构造方法上加注解即可,这里有点不同,我们想一想是调用类的构造方法来注入被调用类
构造方法上我们用@Autowired(按照类型可以),但是 @Resource(按照名字是不行的会报错)调用类的构造方法和被调用类构不成任何关系,和setter方法有区别,


@Autowired默认byType: 
根据构造方法的形参类型或者成员变量类型来自动装配。Spring容器查找容器中的全部Bean,如果正好有一个Bean类型与构造方法的形参类型或者成员变量类型匹配,
就自动注入这个Bean;如果找到多个这样的Bean,就抛出一个异常;如果没有找到这样的Bean,则什么都不会发生,setter方法不会被调用;


@Resource默认byName: 
无法根据构造方法名来实现注入,只能根据成员变量名进行自动装配。Spring容器查找容器中全部Bean,找出其id与成员变量名同名的Bean
来完成注入。如果没有找到匹配的Bean实例,则Spring不会进行任何注入;


除此之外还有一点不同的就是使用注解并且用构造方法注入依赖对象时,需要显示的写出无参数构造器,否则会报错,这里很容易理解,我们当前调用类用了注解
所以默认使用无参构造器来实例化当前类的bean,然后我们显示调用带参数构造器来注入依赖对象,无参数构造器没有调用就会报错。如果调用类的实例不会被调用到,那么我们也可以当前类不用注解(省去controller),就可以不用显示写出无参数构造方法  public A(){ }


 @Controller
 public class A{
        @Resource
       private B b;


       public A(B b){
            this.b=b;
          }
    
   }




@Controller
 public class A{
        
       private B b;


       @Autowired
       public A(B b){
            this.b=b;
          }


       
       public A(){
     
       }




   }






最后一点如果想要调用类和被调用类都省去xml中配置bean可以用<context:component-scan base-package="包名"/>这样一来可以实现零bean配置,但是不建议这样,程序可读行不高
要注意如果我们使用了注解来注入依赖类,xml不配置bean,那么我们依赖的对象接口或者类就要用注解标识,否则无法找到。接口就标识它的实现类。


Spring的“零配置”支持


搜索Bean类:
Spring提供如下几个Annotation来标注Spring Bean
@Component: 标注一个普通的Spring Bean类
@Controller: 标注一个控制器组件类
@Service: 标注一个业务逻辑组件类
@Repository: 标注一个DAO组件类
在Spring配置文件中做如下配置,指定自动扫描的包
<context:component-scan base-package="edu.shu.spring.domain"/>


使用@Resource配置依赖
@Resource位于javax.annotation包下,是来自JavaEE规范的一个Annotation,Spring直接借鉴了该Annotation,
通过使用该Annotation为目标Bean指定协作者Bean。使用@Resource与< property…/ >元素的ref属性有相同的效果。
@Resource不仅可以修饰setter方法,也可以直接修饰实例变量,如果使用@Resource修饰实例变量将会更加简单,
此时Spring将会直接使用JavaEE规范的Field注入,此时连setter方法都可以不要。


使用@PostConstruct和@PreDestroy定制生命周期行为
@PostConstruct和@PreDestroy同样位于javax.annotation包下,也是来自JavaEE规范的两个Annotation,Spring直接借鉴了它们,
用于定制Spring容器中Bean的生命周期行为。它们都用于修饰方法,无须任何属性。其中前者修饰的方法时Bean的初始化方法;

而后者修饰的方法时Bean销毁之前的方法。



、@Resource(这个注解属于J2EE的),默认安照名称进行装配,名称可以通过name属性进行指定, 如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在setter方法上默认取属性名进行装配。 当找不到与名称匹配的bean时才按照类型进行装配




  
阅读全文
0 0