spring框架的基本使用

1.是开源的,用来简化企业级应用开发的开发框架
    1)简化开发
    2)解耦18:48 2017/8/15     
    3)集成其他框架

2.spring容器 是spring框架当中的一个核心模块,用来管理对象(包括对象的创建、初始化、销毁)

  启动Spring容器的步骤
    a、导包 ---在maven上导 spring-webmvc 3.2.8版本
    b、添加配置文件  将applicationContext.xml这个文件复制到resource文件夹下
    c、启动spring容器    在/main/java文件夹下创建一个类,在这个类中写两行代码    String config="applicationContext.xml";
                                            /*ApplicationContext:是一个接口
                                            ClassPathXmlApplicationContext:是实现上面接口的具体类,这个类依据类路                                            径
                                            去查找配置文件,然后启动spring容器*/
                                            ApplicationContext ac=new ClassPathXmlApplicationContext(config);

3.如何创建对象(让spring容器依据配置文件创建对象)相当于以前的那种new 一个对象,new对象的时候自动调用构造方法。
  方法一、利用无参构造器
    1)为一个类添加无参构造器
    2)在配置文件当中,添加一个bean元素。(配置文件指的是applicationContext.xml)
        <bean id="a1" class="first.Apple"/>添加这句
        其中id属性要求要唯一的不能重复,名字可以随便取只要不重复即可
        class属性,写的是类的完整的名字即:包名.类名
    3)启动容器,调用容器的getBean方法来获得对象
        //通过容器获得对象
        //getBean方法:第一个参数是Bean的id值
        //第二参数是该对象对应的class对象 即:写类名.class
        Apple a1=ac.getBean("a1",Apple.class);//返回的是一个Object的对象

 方法二、利用静态工厂方法来创建对象(了解)
        注:通过调用类的静态方法来创建对象。
    <!-- 利用静态工厂方法来创建对象
        factory-method属性:指定一个静态方法名。
        容器会调用类的静态方法来创建对象
     -->
    <bean id="a3" class="java.util.Calendar" factory-method="getInstance"/>
 方法三、实例化工厂方法来创建对象(了解)
            注:通过调用对象的实例方法来创建对象。
<!-- 利用实例工厂方法来创建对象
        factory-bean属性:指定bean的id
        容器会调用该bean的实例方法来创建对象
    -->
    <bean id="a4" factory-bean="a3" factory-method="getTime"/>

4.生命周期的管理
    1)初始化(就是分配资源)
    在<bean id="a1" class="first.Apple" init-method="init"/> 添加init-method="init"这个属性,这样就在实例化的时候也初始化了
    2)销毁(回收资源)
    <bean id="mb1" class="basic.MessageBean" destroy-method="destroy"/>添加destroy-method="destroy"这个属性,这样在关闭容器前就会调用这个销毁方法
    调用close方法关闭容器的话,在启动容器的那边要用AbstractApplicationContext ,只有这个下面才有close方法
    注:当作用域为单例Singleton的时候销毁方法才能骑作用(默认就是Singleton)


5.作用域
        a、默认情况下,对于某一个bean来说,无论调用多少次getBean方法都只有一个对象
        b、如果想要每调用getBean方法就创建一个新的对象,就在<bean id="a1" class="first.Apple"/>里添加scope属性,值为prototype(这个称谓原型)                              <bean id="sb1" class="basic.ScopeBean" scope="prototype"/>
        scope的默认值为singleton


6.延迟加载
    1)默认情况下,容器启动之后,会将所有的单例的(singleton) 的bean全部实例化
    2)要想让其延迟加载,也就是说让其在获取对象的时候再实例化,要在bean中添加lazy-init属性,设置为true
    这样在容器启动的时候,不会进行实例化,只有在获取对象的时候再实例化



7.IOC和DI
    1)Inversion of Control 控制反转   对象之间的依赖关系由原来的通过new来建立的转为由容器来建立
    2)DI Dependency Inject 依赖注入  容器通过调用set方法或构造方法来建立依赖关系
        IOC是一种思想,是要达到的目的   DI是达到这个目的的手段,方法

        3)依赖注入的两种方式
        a、set方法注入
                     第一步:为类添加一个set方法
             第二步:在配置文件当中添加<property>标签,表示这是用set方法注入依赖关系
        <!--     使用set方法来注入依赖关系
    property元素:表示的是set方法注入
    name属性:指定了属性名,即调用哪个set方法(将name的值的首字母大写再在前面加上set,就是调用的这个方法)
    ref属性:指定注入的bean的id,即将ref指定的那个对象作为参数传入到set方法中 -->
    <bean id="b1" class="ioc.B"/>
    <bean id="a1" class="ioc.A">
        <property name="b" ref="b1"/>
    </bean>
    这是将B注入到A中,A中可以调用执行B的方法

                b、构造器注入
            第一步、添加响应的构造器
                        第二步、使用<constructor-arg index="0" ref="a1"/>来表示用构造器注入依赖关系

                 constructor-arg属性:表示使用构造器注入
                         index属性:表示参数的下标,下标是从0开始的,如果有多个参数,就要写多个<constructor-arg\>标签
                         ref属性:表示要注入进来的类的id


        4)自动装配注入(了解)
              a、 默认情况下。容器不会自动装配
              b、自动装配,指的是容器依据某些规则,自动建立对象之间的依赖关系
                         注:容器任然要通过调用set方法或则构造器来建立依赖关系
        
        <!-- 自动分配
        autowire属性:表示让spring容器按照某些规则自动建立对象之间的依赖关系
        byName属性:根据类中的属性名(即成员变量名)去查找对应的bean的id,找到之后
        调用对应的set方法
        注意点:要注入的那个类的id要和被注入的那个类里面的成员变量名一样,
        如果找不到对应的bean的id,就不会注入
        byType属性:容器依据属性类型(即成员变量名的类型)去查找对应的bean的class
        找到之后调用对应的set方法  ,如果找到多个会报错
        constructor属性:与byType类似,找到之后调用对应的构造器
    -->
    <bean id="w" class="auto.Waiter"/>
    <bean id="r" class="auto.Restaurant" autowire="byName"/>


8、注入基本类型的值
 <!--     注入基本类型的值
    value属性:用来注入基本类型的值(也就是给变量赋值)
    name属性:是要赋值的变量 -->
    
    <bean id="stu" class="value.Student">
        <property name="name" value="donghaihua"/>
        <property name="age" value="27"/>
    </bean>

9、注入集合类型的值
    list类型的    <bean id="stu" class="value.Student">     
                <property name="interest">     name指的是要赋值的变量
              <list>
                <value>读书</value>
                <value>敲代码</value>
            
              </list>
                </property>

        Set类型的     <property name="city">
            <set>
                <value>北京</value>
                <value>上海</value>
                <value>南京</value>            
            </set>
              </property>

        Map类型的     <property name="score">
            <map>
                <entry key="english" value="8"/>
                <entry key="math" value="2"/>        
            </map>
              </property>

    properties类型的  <property name="db">
                <props>
                <prop key="user">hexinwen</prop>
                <prop key="pwd">123</prop>
                </props>
        
                  </property>

10、应用的方式注入集合类型的值
    先将集合类型的值配置成一个bean
    使用ref属性类注入这个bean

    <!-- 用引用方式注入集合类型的值 -->
    <!--先将集合类型的值配置成一个bean
        注:命名空间:为了区分通同名的元素,在元素前添加的一个限定(为了避免命名空间冲突,经常是一个域名)
    -->
    <util:list id="aaa">
             <value>杭州</value>
         <value>郑州</value>
             <value>徐州</value>    
    </util:list>
        <util:set id="bbb">
                <value>山西</value>
            <value>山东</value>
            <value>江西</value>    
    </util:set>
    <util:map id="ccc">
               <entry key="english" value="8"/>
            <entry key="math" value="2"/>    
    </util:map>
    
    <util:properties id="ddd">
           <prop key="user">hexinwen</prop>
           <prop key="pwd">123</prop>    
    </util:properties>
    <bean id="stu2" class="value.Student">
        <property name="interest" ref="aaa"/>
            <property name="city" ref="bbb"/>
        <property name="score" ref="ccc"/>
        <property name="db" ref="ddd"/>
    </bean>


11、读取属性文件(.properties文件)

         <!-- 读取属性文件的内容
        location属性:指定属性文件的位置(classpath表示让容器依据类路径去查找)
        注:容器依据location指定的位置找到对应的属性文件,然后读取属性文件的内容
        并将这些聂彤添加到proper贴对上上
     -->
    
    <util:properties id="fff" location="classpath:config.properties"/>


12、Spring表达式
    作用 用于读取其他bean的属性以及集合类型的值
    a、基本类型的值
        语法  #{id.name}  id指向的对象的下面的变量name的值
    b、list集合的值
    语法:<property name="interest" value="#{stu.interest[1]}"/>  interest[1]这个表示读取stu对象下面的interest属性下面的第几个value的值
    c、map集合的值
    <property name="score" value="#{stu.score.english}"/>    stu.score.english这个表示读取stu对象下面的score属性下面key为English的值,也可以写成                                                                 #{stu.score['english']}
    d、从配置文件里读取想要的值
        <property name="pageSize" value="#{fff['pageSize']}"/>   fff['pageSize']这个表从id为fff的那个配置文件里面读取pageSize的属性的值

13、使用注解简化配置文件
    1)组件扫描
     Spring容器启动只有,会检查某个包以及子包下面的所有的类,如果该类前面添加了一些特定的注解,则容器hi将该类纳入容器进行管理(相当于配置了一个bean元素)

        语法:   <!-- 配置主键扫描
                         base-package属性:指定要扫描的包名  写的是包名
                         注:容器启动之后会扫描该包以及子包,下面所有的类,如果该类前面有特定的注解(例如@cmponent)
                         那么容器会将该类纳入容器进行管理(相当于配置了一个bean元素) -->
    
                         <context:component-scan base-package="annotation"/>

        在用getBean方法获取对象的时候,id的位置可以使用缺省id(就是将类名小写后,就是缺省id),也可以在类的注解的后面加("id"),例如@Component("a1")

    2)进行组件扫描的步骤(这样就不要在添加<bean>来配置了)
        第一步:在配置文件中添加
            <context:component-scan base-package="annotation"/>
        第二步:在类的前面添加一些注解
            例如:@Component    @Named    @Repository       @Service      @Controller


    3)初始化方法的注解   @PostConstruct   指定初始化的那个方法   需要从maven上导包 盗annotation  1.2的那个版本 ,导入到pom.xml的  写在方法前面
      销毁方法的注解     @PreDestroy      指定销毁的那个方法   写在方法前面
      作用域的注解       @Scope("prototype")  写在类的前面
          延迟加载的注解     @Lazy(true)          卸载类的前面

        4)使用注解进行依赖关系的注入  
        用注解的set方式注入
           a、@Autowired
       public void setWt(@Qualifier("wt") Waiter wt) {  //@Qualifier("wt") 指定要注入的那个类的id  如果不写@Qualifier("wt")会按照byType的方式自动装配
        this.wt = wt;
        System.out.println("set的方法");
    }
        用注解的有参构造注入
         @Autowired
         public Leader(@Qualifier("wt") Waiter wt){
        this.wt=wt;
        System.out.println("领导的无参构造器");
        }

    @Autowired表示set方法和有参构造器方法注入都支持

    如果是set方法注入,可以将@Autowired这个注解写在set方法前,也可以写在成员变量前这时不用写set方法

           b、    @Resource(name="wt")
    public void setWt(Waiter wt) {
        this.wt = wt;
        System.out.println("经理的set方法");
    }

        @Resource(name="wt")表示用set方法注入依赖关系 同样和@Autowired也可以写在成员变量前这时不用谢set方法 这个注解只支持set方法的注入5
                                  name属性表示要注入进来的类的id

    5)注入基本类型的值的相关注解
            
                    给基本类型的变量用注解方式赋值   用@Value()  这个注解
            @Value("donghaihua")
                    private String name;
            @Value("#{config.pageSize}")    从配置文件中读取 也可以写成 @Value("#{config['pageSize']}")
                    private String pageSize;

                    这个注解可以写在属性变量的前面,也可以写在set方法的前面
             用这个时候不能用bean注入class,也要用注解方式将类注入

猜你喜欢

转载自blog.csdn.net/donghua19900508/article/details/77942822