IOC操作Bean管理

  1. 什么是Bean管理

    • Bean管理指的就是兩個操作:
    • 由Spring創(chuàng)建對象
    • SPring注入屬性
  2. Bean管理操作有兩種方式

    • 基于xml配置文件方式實現(xiàn)
    • 基于注解方式實現(xiàn)
  3. 基于xml方式創(chuàng)建對象

    <!--配置User類對象的創(chuàng)建-->
    <bean id="user" class="com.spring5.test.User"></bean>
    
    • 在Spring配置文件中,使用bean標簽,標簽里面添加對應屬性扭仁,就可以實現(xiàn)對象的創(chuàng)建
    • 在bean標簽有很多屬性晓折,介紹常用的屬性:
      • id屬性:對應對象唯一的標識
      • class屬性:類全路徑(包類路徑)
      • name屬性:同id屬性,但是id屬性不能使用/呢簸,但name屬性中可以使用/
    • 創(chuàng)建對象時矮台,默認執(zhí)行無參數(shù)構(gòu)造方式完成對象創(chuàng)建

基于xml方式注入屬性


DI:依賴注入乏屯,就是注入屬性

  • 第一種注入方式:使用set方法進行注入

    public class Book {
    
        private String bname;
        private String bauthor;
          
        public void setBname(String bname) {
            this.bname = bname;
        }
          
        public void setBauthor(String bauthor) {
            this.bauthor = bauthor;
        }
          
        @Override
        public String toString() {
            return "Book{" +
                    "bname='" + bname + '\'' +
                    ", bauthor='" + bauthor + '\'' +
                    '}';
        }
    }
    
    <!--set方法注入屬性-->
    <bean id="book" class="com.spring5.test.Book">
          <!--
              使用property完成屬性注入
              name: 類屬性名稱
              value: 向?qū)傩宰⑷氲闹?      -->
        <property name="bname" value="bookName"></property>
        <property name="bauthor" value="fallbackcolt"></property>
    </bean>
    
  • 第二種注入方式:使用有參數(shù)構(gòu)造方法進行注入

    public class Orders {
    
        private String oname;
        private String address;
    
        public Orders(String oname, String address) {
            this.oname = oname;
            this.address = address;
        }
    
        @Override
        public String toString() {
            return "Orders{" +
                    "oname='" + oname + '\'' +
                    ", address='" + address + '\'' +
                    '}';
        }
    }
    
    <!--有參構(gòu)造注入屬性-->
    <bean id="orders" class="com.spring5.test.Orders">
        <constructor-arg name="oname" value="orderName"></constructor-arg>
        <constructor-arg name="address" value="orderAddress"></constructor-arg>
    </bean>
    

p名稱空間注入(了解)

  • 使用p名稱空間注入,可以簡化基于xml配置方式

  • 添加p名稱空間在配置文件中

  • 進行屬性注入瘦赫,在bean標簽里面進行操作(p名稱屬性注入的類必須包含set方法)

  • xml注入其他類型屬性
    • 字面值

      1. null值
      <!--null值-->
      <property name="address">
          <null/>
      </property>
      
      1. 屬性值包含特殊符號
      <!--
          屬性值包含特殊符號
          1. 把<>進行轉(zhuǎn)義
          2. 把特殊符號內(nèi)容寫到CDATA中
      -->
      <property name="address" >
          <value><![CDATA[<<南京>>]]></value>
      </property>
      
    • 注入屬性-外部bean

      1. 創(chuàng)建兩個類service類和dao類
      public class UserService {
          // 創(chuàng)建USerDao類型屬性辰晕,生成set方法
          private UserDao userDao;
          public void setUserDao(UserDao userDao) {
              this.userDao = userDao;
          }
      }
      
      public class UserDaoImpl implements UserDao{
          @Override
          public void update() {
              System.out.println("dao update......");
          }
      }
      
      1. 在service調(diào)用dao里面的方法
          public void add() {
              System.out.println("service add......");
              userDao.update();
          }
      
      1. 在Spring配置文件中進行配置
          <!--service和dao對象的創(chuàng)建-->
          <bean id="userService" class="com.spring5.test.service.UserService">
              <!--
                  注入userDao對象
                  ref屬性(注入外部bean):創(chuàng)建userDao對象bean標簽的id值
              -->
              <property name="userDao" ref="userDao"></property>
          </bean>
          <bean id="userDao" class="com.spring5.test.dao.UserDaoImpl"></bean>
      
    • 注入屬性-內(nèi)部bean

      1. 一對多關(guān)系: 部門和員工
      2. 在實體類之間表示一對多關(guān)系,員工表示所屬部門确虱,使用對象類型屬性進行表示
      public class Dept {
      
          private String dname;
      
          public void setDname(String dname) {
              this.dname = dname;
          }
          
          @Override
          public String toString() {
              return "Dept{" +
                      "dname='" + dname + '\'' +
                      '}';
          }
      }
      
      public class Emp {
      
          private String ename;
          private String gender;
          // 員工屬于某一個部門含友,使用對象形式表示
          private Dept dept;
      
          public void setEname(String ename) {
              this.ename = ename;
          }
      
          public void setGender(String gender) {
              this.gender = gender;
          }
      
          public void setDept(Dept dept) {
              this.dept = dept;
          }
          
          @Override
          public String toString() {
              return "Emp{" +
                      "ename='" + ename + '\'' +
                      ", gender='" + gender + '\'' +
                      ", dept=" + dept +
                      '}';
          }
      }
      
      1. 在Spring配置文件中進行配置
      <!--內(nèi)部bean-->
      <bean id="emp" class="com.spring5.test.bean.Emp">
          <property name="ename" value="fallbackcolt"></property>
          <property name="gender" value="male"></property>
          <property name="dept">
              <bean id="dept" class="com.spring5.test.bean.Dept">
                  <property name="dname" value="保安部"></property>
              </bean>
          </property>
      </bean>
      
    • 注入屬性-級聯(lián)賦值

      • 在Spring配置文件中進行配置

        <!--級聯(lián)賦值-->
        <!--第一種寫法,感覺與外部注入差不多-->
        <bean id="emp" class="com.spring5.test.bean.Emp">
            <property name="ename" value="fallbackcolt"></property>
            <property name="gender" value="male"></property>
            <!--級聯(lián)賦值-->
            <property name="dept" ref="dept"></property>
        </bean>
        
        <bean id="dept" class="com.spring5.test.bean.Dept">
            <property name="dname" value="財務部"></property>
        </bean>
        
        <!--第二種寫法-->
        <bean id="emp2" class="com.spring5.test.bean.Emp">
            <property name="ename" value="fallbackcolt"></property>
            <property name="gender" value="male"></property>
            <!--級聯(lián)賦值-->
            <!--
                使用dept.dname的前提是校辩,Emp類必須有對應的getDept()方法
                將dept2的值重新賦值為技術(shù)部
            -->
            <property name="dept" ref="dept2"></property>
            <property name="dept.dname" value="技術(shù)部"></property>
        </bean>
        <!--創(chuàng)建新的Dept對象dept2窘问,并且初始化-->
        <bean id="dept2" class="com.spring5.test.bean.Dept">
            <property name="dname"><null/></property>
        </bean>
        
      • 在Emp類中添加getDept()方法

        public Dept getDept() {
            return dept;
          }
        

xml注入集合屬性

  • 創(chuàng)建Stu類,定義數(shù)組召川、list南缓、map、set類型屬性荧呐,并生成對應是set方法

    public class Stu {
    
        // 數(shù)組類型屬性
        private String[] courses;
    
        // list集合類型屬性
        private List<String> list;
    
        // map集合類型屬性
        private Map<String, String> maps;
    
        // set集合類型屬性
        private Set<String> sets;
    
        public void setCourses(String[] courses) {
            this.courses = courses;
        }
    
        public void setList(List<String> list) {
            this.list = list;
        }
    
        public void setMaps(Map<String, String> maps) {
            this.maps = maps;
        }
    
        public void setSets(Set<String> sets) {
            this.sets = sets;
        }
        
        @Override
        public String toString() {
            return "Stu{" +
                    "courses=" + Arrays.toString(courses) +
                    ", list=" + list +
                    ", maps=" + maps +
                    ", sets=" + sets +
                    '}';
        }
    }
    
  • 在Spring配置文件中進行配置

    <!--集合類型屬性注入-->
    <bean id="stu" class="com.spring5.test.collectiontype.Stu">
        <!--數(shù)組類型屬性注入-->
        <property name="courses">
            <!--list汉形、array標簽都可以-->
            <list>
                <value>java課程</value>
                <value>數(shù)據(jù)庫課程</value>
            </list>
        </property>
    
        <!--list類型屬性注入-->
        <property name="list">
            <!--list、array標簽都可以-->
            <array>
                <value>張三</value>
                <value>李四</value>
            </array>
        </property>
    
        <!--map類型屬性注入-->
        <property name="maps">
            <map>
                <entry key="JAVA" value="java"></entry>
                <entry key="PHP" value="php"></entry>
            </map>
        </property>
    
        <!--set類型屬性注入-->
        <property name="sets">
            <set>
                <value>MySQl</value>
                <value>Redis</value>
            </set>
        </property>
    </bean>
    
  • 在集合里面設(shè)置對象類型值

    1. 創(chuàng)建Course類

      public class Course {
      
          // 課程名稱
          private String cname;
      
          public void setCname(String cname) {
              this.cname = cname;
          }
      
          @Override
          public String toString() {
              return "Course{" +
                      "cname='" + cname + '\'' +
                      '}';
          }
      }
      
    2. 將Stu類中添加CourseList屬性倍阐,并重寫toString()方法

          // 學生所學的多門課程
          private List<Course> courseList;
      
          public void setCourseList(List<Course> courseList) {
              this.courseList = courseList;
          }
      
    3. 在Spring配置文件中設(shè)置對象屬性值

      <!--在bean.xml中Stu對象中添加courseList屬性-->
      <!--注入list集合類型屬性概疆,值為Course對象-->
      <property name="courseList">
          <list>
              <ref bean="course1"></ref>
              <ref bean="course2"></ref>
          </list>
      </property>
      
      <!--其中courseList中的值為下面兩個Course對象-->
      <!--創(chuàng)建多個Course對象-->
      <bean id="course1" class="com.spring5.test.collectiontype.Course">
          <property name="cname" value="Spring5框架"></property>
      </bean>
      <bean id="course2" class="com.spring5.test.collectiontype.Course">
          <property name="cname" value="MyBatis框架"></property>
      </bean>
      
  • 把集合注入部分提取出來

    1. 新建Book類

      public class Book {
      
          private List<String> list;
      
          public void setList(List<String> list) {
              this.list = list;
          }
      
          @Override
          public String toString() {
              return "Book{" +
                      "list=" + list +
                      '}';
          }
      }
      
    2. 在Spring配置文件中引入名稱空間util

      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://www.springframework.org/schema/beans"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:util="http://www.springframework.org/schema/util"
             xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                                 http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
      </beans>
      
    3. 使用util標簽完成list集合注入提取

      <!--提取list集合類型屬性注入-->
      <util:list id="bookList">
          <value>從零開始學JAVA</value>
          <value>從零開始學PYTHON</value>
          <value>從零開始學MySQL</value>
      </util:list>
      
      <!--提取list集合類型屬性注入使用-->
      <bean id="book" class="com.spring5.test.collectiontype.Book">
          <property name="list" ref="bookList"></property>
      </bean>
      

FactoryBean

  • Spring有兩種類型bean,一種普通bean峰搪,另外一種工廠bean(FactoryBean)

    • 普通bean:在配置文件中定義bean類型就是返回類型

    • 工廠bean:在配置文件中定義bean類型可以和返回類型不一樣

      1. 創(chuàng)建類岔冀,讓這個類作為工廠bean,實現(xiàn)接口FactoryBean

        public class MyBean implements FactoryBean<Course> {
        
        }
        
      2. 實現(xiàn)接口里的方法概耻,在實現(xiàn)的方法中定義返回的bean類型

            // 定義返回bean
            @Override
            public Course getObject() throws Exception {
                Course course = new Course();
                course.setCname("test");
                return course;
            }
        
            @Override
            public Class<?> getObjectType() {
                return null;
            }
        
            @Override
            public boolean isSingleton() {
                return FactoryBean.super.isSingleton();
            }
        

bean作用域

  • 在Spring里面使套,設(shè)置bean實例是單實例還是多實例
  • 在Spring里面,默認情況下bean是單實例對象
  • 設(shè)置bean多實例對象
    • 在Spring配置文件中鞠柄,bean標簽中侦高,有屬性scope用于設(shè)置單實例或者多實例
    • scope屬性值:
      1. 默認值:singleton,表示單實例對象
      2. prototype厌杜,表示多實例對象
      3. request奉呛,表示每一次http新的請求都會產(chǎn)生一個新的bean對象
      4. session,表示每一個獨立的session會有一個新的bean對象
    • singletonprototype區(qū)別:
      1. singleton是單實例夯尽,prototype是多實例
      2. 設(shè)置scope值是singleton時瞧壮,加載Spring配置文件時,就會創(chuàng)建單實例對象
      3. 設(shè)置scope值是prototype時匙握,在調(diào)用getBean()方法才會創(chuàng)建多實例對象

bean的生命周期

  • 生命周期

    • 從對象創(chuàng)建到對象銷毀的過程
  • bean的生命周期

    1. 通過構(gòu)造器創(chuàng)建bean實例(無參數(shù)構(gòu)造)
    2. 為bean的屬性設(shè)置值和對其他bean的引用(調(diào)用set方法)
    3. 調(diào)用bean的初始化的方法(通過設(shè)置bean標簽中的init-method為聲明的方法進行配置)
    4. bean可以使用了(對象獲取到了)
    5. 當容器關(guān)閉的時候咆槽,調(diào)用bean的銷毀的方法((通過設(shè)置bean標簽中的destroy-method為聲明的方法進行配置)
  • 演示bean的生命周期

    1. 新建Orders類

      public class Orders {
      
          public Orders() {
              System.out.println("1.執(zhí)行了無參數(shù)構(gòu)造創(chuàng)建bean實例");
          }
      
          private String oname;
      
          public void setOname(String oname) {
              this.oname = oname;
              System.out.println("2.調(diào)用set方法設(shè)置屬性的值");
          }
      
          // 創(chuàng)建執(zhí)行初始化的方法
          public void initMethod() {
              System.out.println("3.執(zhí)行初始化方法");
          }
      
          // 創(chuàng)建執(zhí)行銷毀的方法
          public void destroyMethod() {
              System.out.println("5.執(zhí)行銷毀的方法");
          }
      
      }
      
    2. 配置bean.xml文件

      <bean id="orders" class="com.spring5.test.bean.Orders" init-method="initMethod" destroy-method="destroyMethod">
          <property name="oname" value="PC"></property>
      </bean>
      
    3. 測試

      @Test
      public void testOrders() {
          ApplicationContext context = new ClassPathXmlApplicationContext("bean4.xml");
          Orders orders = context.getBean("orders", Orders.class);
          System.out.println("4.獲取創(chuàng)建的bean實例對象");
          System.out.println(orders);
      
          // 手動執(zhí)行bean實例的銷毀
          // ClassPathXmlApplicationContext才有close,ApplicationContext沒有close
          ((ClassPathXmlApplicationContext)context).close();
      }
      
    4. 測試運行結(jié)果

      1.執(zhí)行了無參數(shù)構(gòu)造創(chuàng)建bean實例
      2.調(diào)用set方法設(shè)置屬性的值
      3.執(zhí)行初始化方法
      4.獲取創(chuàng)建的bean實例對象
      com.spring5.test.bean.Orders@587e5365
      5.執(zhí)行銷毀的方法

      Process finished with exit code 0

  • bean的后置處理器肺孤,加上后置處理器后bean的生命周期有7步

    1. 通過構(gòu)造器創(chuàng)建bean實例(無參數(shù)構(gòu)造)
    2. 為bean的屬性設(shè)置值和對其他bean的引用(調(diào)用set方法)
    3. 把bean實例傳遞給bean后置處理器的postProcessBeforeInitialization方法
    4. 調(diào)用bean的初始化的方法(通過設(shè)置bean標簽中的init-method為聲明的方法進行配置)
    5. 把bean實例傳遞給bean后置處理器的postProcessAfterInitialization方法
    6. bean可以使用了(對象獲取到了)
    7. 當容器關(guān)閉的時候罗晕,調(diào)用bean的銷毀的方法((通過設(shè)置bean標簽中的destroy-method為聲明的方法進行配置)
  • 演示添加后置處理器效果

    1. 創(chuàng)建類济欢,實現(xiàn)接口BeanPostProcessor

      public class OrdersPost implements BeanPostProcessor {
      
          @Override
          public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
              System.out.println("a.在初始化之前執(zhí)行的方法");
              return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);
          }
      
          @Override
          public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
              System.out.println("b.在初始化之后執(zhí)行的方法");
              return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
          }
      }
      
    2. 在bean.xml中配置后置處理器

      <!--配置后置處理器-->
      <bean id="ordersPost" class="com.spring5.test.bean.OrdersPost"></bean>
      
    3. 測試運行結(jié)果

      1.執(zhí)行了無參數(shù)構(gòu)造創(chuàng)建bean實例
      2.調(diào)用set方法設(shè)置屬性的值
      a.在初始化之前執(zhí)行的方法
      3.執(zhí)行初始化方法
      b.在初始化之后執(zhí)行的方法
      4.獲取創(chuàng)建的bean實例對象
      com.spring5.test.bean.Orders@305b7c14
      5.執(zhí)行銷毀的方法

      Process finished with exit code 0


xml自動裝配

  • 什么是自動裝配

    根據(jù)指定裝配規(guī)則(屬性名稱或者屬性類型),Spring自動將匹配的屬性值進行注入

  • 演示自動裝配過程

    • 根據(jù)屬性名稱自動注入

      <!--
          實現(xiàn)自動裝配
          autowire: 配置自動裝配
          |___byName: 根據(jù)屬性名稱注入小渊,注入bean的id值和類屬性名一樣
          |___byType: 根據(jù)屬性類型注入
      -->
      <bean id="emp" class="com.spring5.test.autowire.Emp" autowire="byName">
          <!--<property name="dept" ref="dept"></property>-->
      </bean>
      <bean id="dept" class="com.spring5.test.autowire.Dept"></bean>
      
    • 根據(jù)屬性類型自動注入

      <bean id="emp" class="com.spring5.test.autowire.Emp" autowire="byType">
          <!--<property name="dept" ref="dept"></property>-->
      </bean>
      <bean id="dept" class="com.spring5.test.autowire.Dept"></bean>
      

管理外部屬性文件

  • 直接配置數(shù)據(jù)庫信息

    • 配置druid連接池

    • 引入druid連接池依賴jar包

    • 配置bean.xml

      <!--直接配置連接池-->
      <bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource">
          <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
          <property name="url" value="jdbc:mysql://localhost:3306/Test"></property>
          <property name="username" value="test"></property>
          <property name="password" value="123456"></property>
      </bean>
      
      
  • 通過引入外部屬性文件配置數(shù)據(jù)庫連接池

    1. 創(chuàng)建外部屬性文件法褥,properties格式文件,寫數(shù)據(jù)庫信息

      prop.driverClass=com.mysql.jdbc.Driver
      prop.url=jdbc:mysql://localhost:3306/Test
      prop.username=test
      prop.password=123456
      
    2. 把外部properties屬性文件引入到Spring配置文件中

      • 引入context命名空間

        <beans xmlns="http://www.springframework.org/schema/beans"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:context="http://www.springframework.org/schema/context"
               xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                                   http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
        
      • 在Spring配置文件中使用標簽引入外部屬性文件

        <!--引入外部屬性文件-->
        <context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
        <!--配置連接池-->
        <bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource">
            <property name="driverClassName" value="${prop.driverClass}"></property>
            <property name="url" value="${prop.url}"></property>
            <property name="username" value="${prop.username}"></property>
            <property name="password" value="${prop.password}"></property>
        </bean>
        

基于注解方式注入屬性

  • 什么是注解

    1. 注解是代碼特殊標記酬屉,格式:@注解名稱(屬性名稱=屬性值,屬性名稱=屬性值...)
    2. 使用注解半等,注解可以作用在類、方法以及屬性上面
    3. 使用注解的目的:可以簡化xml配置
  • Spring針對Bean管理中創(chuàng)建對象提供注解

    1. @Component呐萨,通用注解杀饵?
    2. @Service,一般用于業(yè)務邏輯層谬擦,Service層
    3. @Controller切距,一般用于web層
    4. @Repository,一般用于dao層惨远,持久層

    上述四個注解功能是一樣的谜悟,都可以用來創(chuàng)建bean實例

  • 基于注解方式實現(xiàn)對象創(chuàng)建

    1. 導入依賴spring-aop-5.3.9.jar

    2. 開啟組件掃描

      <!--
          開啟組件掃描
          1. 如果掃描多個包,多個包使用逗號隔開
          2. 掃描包的上層目錄
      -->
      <!--<context:component-scan base-package="com.spring5.test.testdemo,com.spring5.test.dao"></context:component-scan>-->
      <context:component-scan base-package="com.spring5.test"></context:component-scan>
      
    3. 創(chuàng)建類北秽,在類上添加創(chuàng)建對象注解

      /*
          在注解里面value屬性值可以省略不寫葡幸,默認值為首字母小寫的類名稱
       */
      @Component(value = "userService") // <bean id="userService" class="..."></bean>
      public class UserService {
      
          public void add() {
              System.out.println("add......");
          }
      
      }
      
    4. 開啟組件掃描細節(jié)配置

      <!--
          示例1
          use-default-filters="false"     表示不使用默認的filter
          context:include-filter          設(shè)置掃描的內(nèi)容
      -->
      <context:component-scan base-package="com.spring5.test" use-default-filters="false">
          <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
      </context:component-scan>
      
      <!--
          示例2
          context:exclude-filter          設(shè)置不掃描的內(nèi)容
      -->
      <context:component-scan base-package="com.spring5.test">
          <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
      </context:component-scan>
      
    5. 基于注解方式實現(xiàn)屬性注入

      • @AutoWired:根據(jù)屬性類型進行自動注入

        1. 把service和dao對象創(chuàng)建,在service和dao類添加創(chuàng)建對象注解
        2. 在service注入dao對象贺氓,在service類添加dao類型屬性蔚叨,在屬性上面
      • @Qualifier:根據(jù)屬性名稱進行自動注入(和@AutoWired一起使用,Qualifier(value="xxx")

      • @Resource:可以根據(jù)類型注入辙培,也可以根據(jù)名稱注入(高版本已經(jīng)移除該注解蔑水,@Resource是javax的包,不是Spring的包)

      • @Value:注入普通類型屬性(@Value(value="xxx")

        public interface UserDao {
        
            public void add();
        
        }
        
        @Repository(value = "userDaoImpl1")
        public class UserDaoImpl implements UserDao{
        
            @Override
            public void add() {
                System.out.println("userDaoImpl add...");
            }
        
        }
        
        // 在注解里面value屬性值可以省略不寫扬蕊,默認值為首字母小寫的類名稱
        @Service(value = "userService") // <bean id="userService" class="..."></bean>
        public class UserService {
        
            // 定義dao類型屬性
            // 不需要添加set方法
            // 添加注入屬性注解
            @Autowired
            @Qualifier(value = "userDaoImpl1")
            private UserDao userDao;
        
            @Value(value = "initNameValue")
            private String name;
        
            public void add() {
                System.out.println("name=" + name);
                System.out.println("userService add......");
                userDao.add();
            }
        
        }
        
  • 完全注解開發(fā)

    1. 創(chuàng)建配置類肤粱,替代xml配置文件

      @Configuration // 作為配置類,替代xml配置文件
      @ComponentScan(basePackages = {"com.spring5.test"})
      public class SpringConfig {
      
      }
      
    2. 編寫測試類

      @Test
      public void addTest2() {
          ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
          UserService userService = context.getBean("userService", UserService.class);
          System.out.println(userService);
          userService.add();
      }
      

      com.spring5.test.service.UserService@57d7f8ca
      name=initNameValue
      userService add......
      userDaoImpl add...

      Process finished with exit code 0

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末厨相,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鸥鹉,更是在濱河造成了極大的恐慌蛮穿,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件毁渗,死亡現(xiàn)場離奇詭異践磅,居然都是意外死亡,警方通過查閱死者的電腦和手機灸异,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門府适,熙熙樓的掌柜王于貴愁眉苦臉地迎上來羔飞,“玉大人,你說我怎么就攤上這事檐春÷咛剩” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵疟暖,是天一觀的道長卡儒。 經(jīng)常有香客問我,道長俐巴,這世上最難降的妖魔是什么骨望? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮欣舵,結(jié)果婚禮上擎鸠,老公的妹妹穿的比我還像新娘。我一直安慰自己缘圈,他們只是感情好劣光,可當我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著准验,像睡著了一般赎线。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上糊饱,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天垂寥,我揣著相機與錄音,去河邊找鬼另锋。 笑死滞项,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的夭坪。 我是一名探鬼主播文判,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼室梅!你這毒婦竟也來了戏仓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤亡鼠,失蹤者是張志新(化名)和其女友劉穎赏殃,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體间涵,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡仁热,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了勾哩。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抗蠢。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡举哟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出迅矛,到底是詐尸還是另有隱情妨猩,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布诬乞,位于F島的核電站册赛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏震嫉。R本人自食惡果不足惜森瘪,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望票堵。 院中可真熱鬧扼睬,春花似錦、人聲如沸悴势。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽特纤。三九已至军俊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間捧存,已是汗流浹背粪躬。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留昔穴,地道東北人镰官。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像吗货,于是被迫代替她去往敵國和親泳唠。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,494評論 2 348

推薦閱讀更多精彩內(nèi)容