重拾Java EE——Spring(1)基礎(chǔ)

1 spring框架概述

1.1 什么是spring

  • Spring是一個開源框架慷荔,Spring是于2003 年興起的一個輕量級的Java 開發(fā)框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中闡述的部分理念和原型衍生而來。它是為了解決企業(yè)應(yīng)用開發(fā)的復雜性而創(chuàng)建的』炭矗框架的主要優(yōu)勢之一就是其分層架構(gòu),分層架構(gòu)允許使用者選擇使用哪一個組件六孵,同時為 J2EE 應(yīng)用程序開發(fā)提供集成的框架纬黎。Spring使用基本的JavaBean來完成以前只可能由EJB完成的事情。然而狸臣,Spring的用途不僅限于服務(wù)器端的開發(fā)莹桅。從簡單性、可測試性和松耦合的角度而言烛亦,任何Java應(yīng)用都可以從Spring中受益诈泼。Spring的核心是控制反轉(zhuǎn)(IoC)和面向切面(AOP)。簡單來說煤禽,Spring是一個分層的JavaSE/EE full-stack(一站式) 輕量級開源框架铐达。
  • 輕量級:與EJB對比,依賴資源少檬果,銷毀的資源少瓮孙。
  • 分層: 一站式,每一個層都提供的解決方案
    web層:struts选脊,spring-MVC
    service層:spring
    dao層:hibernate杭抠,mybatis , jdbcTemplate --> spring-data

1.2 spring由來

  • Expert One-to-One J2EE Design and Development
  • Expert One-to-One J2EE Development without EJB

1.3 spring核心

  • Spring的核心是控制反轉(zhuǎn)(IoC)和面向切面(AOP)

1.4 spring優(yōu)點

  • 方便解耦恳啥,簡化開發(fā) (高內(nèi)聚低耦合)
    ? Spring就是一個大工廠(容器)偏灿,可以將所有對象創(chuàng)建和依賴關(guān)系維護,交給Spring管理
    ? spring工廠是用于生成bean
  • AOP編程的支持
    ? Spring提供面向切面編程钝的,可以方便的實現(xiàn)對程序進行權(quán)限攔截翁垂、運行監(jiān)控等功能
  • 聲明式事務(wù)的支持
    ? 只需要通過配置就可以完成對事務(wù)的管理铆遭,而無需手動編程
  • 方便程序的測試
    ? Spring對Junit4支持,可以通過注解方便的測試Spring程序
  • 方便集成各種優(yōu)秀框架
    ? Spring不排斥各種優(yōu)秀的開源框架沿猜,其內(nèi)部提供了對各種優(yōu)秀框架(如:Struts枚荣、Hibernate、MyBatis啼肩、Quartz等)的直接支持
  • 降低JavaEE API的使用難度
    ? Spring 對JavaEE開發(fā)中非常難用的一些API(JDBC橄妆、JavaMail、遠程調(diào)用等)祈坠,都提供了封裝呼畸,使這些API應(yīng)用難度大大降低

1.5 spring體系結(jié)構(gòu)

核心容器:beans、core颁虐、context、expression

2 入門案例:IoC【掌握】

2.1 導入jar包

  • 4 + 1 : 4個核心(beans卧须、core另绩、context、expression) + 1個依賴(commons-loggins...jar)

2.2 目標類

  • 提供UserService接口和實現(xiàn)類
  • 獲得UserService實現(xiàn)類的實例
    之前開發(fā)中花嘶,直接new一個對象即可笋籽。
    學習spring之后,將由Spring創(chuàng)建對象實例--> IoC 控制反轉(zhuǎn)(Inverse of Control)
    之后需要實例對象時椭员,從spring工廠(容器)中獲得车海,需要將實現(xiàn)類的全限定名稱配置到xml文件中
public interface UserService {
    
    public void addUser();

}

public class UserServiceImpl implements UserService {

    @Override
    public void addUser() {
        System.out.println("a_ico add user");
    }

}

2.3 配置文件

  • 位置:任意,開發(fā)中一般在classpath下(src)
  • 名稱:任意隘击,開發(fā)中常用applicationContext.xml
  • 內(nèi)容:添加schema約束
    約束文件位置:
    spring-framework-3.2.0.RELEASE\docs\spring-framework-reference\html\ xsd-config.html
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
                           http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!-- 配置service 
        <bean> 配置需要創(chuàng)建的對象
            id :用于之后從spring容器獲得實例時使用的
            class :需要創(chuàng)建實例的全限定類名
    -->
    <bean id="userServiceId" class="com.itheima.a_ioc.UserServiceImpl"></bean>
</beans>

2.4 測試

@Test
public void demo02(){
        //從spring容器獲得
        //1 獲得容器
        String xmlPath = "com/itheima/a_ioc/beans.xml";
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
        //2獲得內(nèi)容 --不需要自己new侍芝,都是從spring容器獲得
        UserService userService = (UserService) applicationContext.getBean("userServiceId");
        userService.addUser();
        
}

3 入門案例:DI【掌握】

  • DI Dependency Injection ,依賴注入
    is a :是一個,繼承埋同。
    has a:有一個州叠,成員變量,依賴凶赁。
        class B {
           private A a;   //B類依賴A類
        }

依賴:一個對象需要使用另一個對象
注入:通過setter方法進行另一個對象實例設(shè)置咧栗。

  • 例如:
    class BookServiceImpl{
        //之前開發(fā):接口 = 實現(xiàn)類  (service和dao耦合)
        //private BookDao bookDao = new BookDaoImpl();
        //spring之后 (解耦:service實現(xiàn)類使用dao接口,不知道具體的實現(xiàn)類)
        private BookDao bookDao;
        setter方法
   }

模擬spring執(zhí)行過程
創(chuàng)建service實例:BookService bookService = new BookServiceImpl() -->IoC <bean>
創(chuàng)建dao實例:BookDao bookDao = new BookDaoImple() -->IoC
將dao設(shè)置給service:bookService.setBookDao(bookDao); -->DI <property>

3.1 目標類

  • 創(chuàng)建BookService接口和實現(xiàn)類
  • 創(chuàng)建BookDao接口和實現(xiàn)類
  • 將dao和service配置 xml文件
  • 使用api測試

3.1.1 dao

public interface BookDao {
    
    public void addBook();

}
public class BookDaoImpl implements BookDao {

    @Override
    public void addBook() {
        System.out.println("di  add book");
    }

}

3.1.2 service

public interface BookService {

    public abstract void addBook();

}
public class BookServiceImpl implements BookService {
    
    // 方式1:之前虱肄,接口=實現(xiàn)類
//  private BookDao bookDao = new BookDaoImpl();
    // 方式2:接口 + setter
    private BookDao bookDao;
    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }
    
    @Override
    public void addBook(){
        this.bookDao.addBook();
    }

}

3.2 配置文件

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
                           http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!-- 
    模擬spring執(zhí)行過程
        創(chuàng)建service實例:BookService bookService = new BookServiceImpl() IoC  <bean>
        創(chuàng)建dao實例:BookDao bookDao = new BookDaoImpl()         IoC
        將dao設(shè)置給service:bookService.setBookDao(bookDao);     DI   <property>
        
        <property> 用于進行屬性注入
            name: bean的屬性名致板,通過setter方法獲得
                setBookDao ##> BookDao  ##> bookDao
            ref :另一個bean的id值的引用
     -->

    <!-- 創(chuàng)建service -->
    <bean id="bookServiceId" class="com.itheima.b_di.BookServiceImpl">
        <property name="bookDao" ref="bookDaoId"></property>
    </bean>
    
    <!-- 創(chuàng)建dao實例 -->
    <bean id="bookDaoId" class="com.itheima.b_di.BookDaoImpl"></bean>
    

</beans>

3.3 測試

@Test
public void demo01(){
    //從spring容器獲得
    String xmlPath = "com/itheima/b_di/beans.xml";
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
    BookService bookService = (BookService) applicationContext.getBean("bookServiceId");
    
    bookService.addBook();
    
}

4 myeclipse schema xml提示

  • 步驟一:確定xsd文件位置

    spring-framework-3.2.0.RELEASE\schema\beans


  • 步驟二:復制路徑

  • 步驟三:搜索“xml catalog”
  • 步驟四:添加約束提示

5 核心API

  • api整體了解,之后不使用咏窿,在學習過程需要斟或。
  • BeanFactory :這是一個工廠,用于生成任意bean翰灾。
    采取延遲加載缕粹,第一次getBean時才會初始化Bean
  • ApplicationContext:是BeanFactory的子接口稚茅,功能更強大。(國際化處理平斩、事件傳遞亚享、Bean自動裝配、各種不同應(yīng)用層的Context實現(xiàn))绘面。當配置文件被加載欺税,就進行對象實例化。
    ClassPathXmlApplicationContext 用于加載classpath(類路徑揭璃、src)下的xml
    加載xml運行時位置 --> /WEB-INF/classes/...xml
    FileSystemXmlApplicationContext 用于加載指定盤符下的xml
    加載xml運行時位置 --> /WEB-INF/...xml
    通過java web ServletContext.getRealPath() 獲得具體盤符
    @Test
    public void demo02(){
        //使用BeanFactory  --第一次條用getBean實例化
        String xmlPath = "com/itheima/b_di/beans.xml";
        
        BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource(xmlPath));
        
        BookService bookService = (BookService) beanFactory.getBean("bookServiceId");
        
        bookService.addBook();
        
    }

6 裝配Bean 基于XML

6.1 實例化方式

  • 3種bean實例化方式:默認構(gòu)造晚凿、靜態(tài)工廠、實例工廠

6.1.1 默認構(gòu)造

<bean id="" class=""> 必須提供默認構(gòu)造

6.1.2 靜態(tài)工廠

  • 常用與spring整合其他框架(工具)
  • 靜態(tài)工廠:用于生成實例對象瘦馍,所有的方法必須是static
    <bean id="" class="工廠全限定類名" factory-method="靜態(tài)方法">

6.1.2.1 工廠

public class MyBeanFactory {
    
    /**
     * 創(chuàng)建實例
     * @return
     */
    public static UserService createService(){
        return new UserServiceImpl();
    }
}

6.1.2.2 spring配置

    <!-- 將靜態(tài)工廠創(chuàng)建的實例交予spring 
        class 確定靜態(tài)工廠全限定類名
        factory-method 確定靜態(tài)方法名
    -->
<bean id="userServiceId" class="com.itheima.c_inject.b_static_factory.MyBeanFactory" 
factory-method="createService"></bean>

6.1.3 實例工廠

  • 實例工廠:必須先有工廠實例對象歼秽,通過實例對象創(chuàng)建對象。提供所有的方法都是“非靜態(tài)”的情组。

6.1.3.1 工廠

/**
 * 實例工廠,所有方法非靜態(tài)
 *
 */
public class MyBeanFactory {
    
    /**
     * 創(chuàng)建實例
     * @return
     */
    public UserService createService(){
        return new UserServiceImpl();
    }

}

6.1.3.2 spring配置

    <!-- 創(chuàng)建工廠實例 -->
    <bean id="myBeanFactoryId" class="com.itheima.c_inject.c_factory.MyBeanFactory"></bean>
    <!-- 獲得userservice 
        * factory-bean 確定工廠實例
        * factory-method 確定普通方法
    -->
    <bean id="userServiceId" factory-bean="myBeanFactoryId" factory-method="createService"></bean>

6.2 Bean種類

  • 普通bean:之前操作的都是普通bean燥筷。<bean id="" class="A"> ,spring直接創(chuàng)建A實例院崇,并返回
  • FactoryBean:是一個特殊的bean肆氓,具有工廠生成對象能力,只能生成特定的對象底瓣。
    bean必須使用 FactoryBean接口谢揪,此接口提供方法 getObject() 用于獲得特定bean。
    <bean id="" class="FB"> 先創(chuàng)建FB實例捐凭,使用調(diào)用getObject()方法拨扶,并返回方法的返回值
    FB fb = new FB();
    return fb.getObject();
  • BeanFactory 和 FactoryBean 對比?
    BeanFactory:工廠柑营,用于生成任意bean屈雄。
    FactoryBean:特殊bean,用于生成另一個特定的bean官套。例如:ProxyFactoryBean 酒奶,此工廠bean用于生產(chǎn)代理。<bean id="" class="....ProxyFactoryBean"> 獲得代理對象實例奶赔。AOP使用

6.3 作用域

  • 作用域:用于確定spring創(chuàng)建bean實例個數(shù)
  • 取值:
    singleton 單例惋嚎,默認值。
    prototype 多例站刑,每執(zhí)行一次getBean將獲得一個實例另伍。例如:struts整合spring,配置action多例。
  • 配置信息
    <bean id="" class="" scope="">



<bean id="userServiceId" class="com.itheima.d_scope.UserServiceImpl" 
        scope="prototype" ></bean>

6.4 生命周期

6.4.1 初始化和銷毀

  • 目標方法執(zhí)行前后執(zhí)行后摆尝,將進行初始化或銷毀温艇。
<bean id="" class="" init-method="初始化方法名稱"  destroy-method="銷毀的方法名稱">

6.4.1.1 目標類

public class UserServiceImpl implements UserService {

    @Override
    public void addUser() {
        System.out.println("e_lifecycle add user");
    }
    
    public void myInit(){
        System.out.println("初始化");
    }
    public void myDestroy(){
        System.out.println("銷毀");
    }

}

6.4.1.2 spring配置

<!--  
        init-method 用于配置初始化方法,準備數(shù)據(jù)等
        destroy-method 用于配置銷毀方法,清理資源等
    -->
    <bean id="userServiceId" class="com.itheima.e_lifecycle.UserServiceImpl" 
        init-method="myInit" destroy-method="myDestroy" ></bean>

6.4.1.3 測試

@Test
public void demo02() throws Exception{
        //spring 工廠
        String xmlPath = "com/itheima/e_lifecycle/beans.xml";
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
        UserService userService = (UserService) applicationContext.getBean("userServiceId");
        userService.addUser();
        
        //要求:1.容器必須close,銷毀方法執(zhí)行; 2.必須是單例的
//      applicationContext.getClass().getMethod("close").invoke(applicationContext);
        // * 此方法接口中沒有定義堕汞,實現(xiàn)類提供
        applicationContext.close();
        
    }

6.4.2 BeanPostProcessor 后處理Bean

  • spring 提供一種機制勺爱,只要實現(xiàn)此接口BeanPostProcessor,并將實現(xiàn)類提供給spring容器讯检,spring容器將自動執(zhí)行琐鲁,在初始化方法前執(zhí)行before(),在初始化方法后執(zhí)行after() 人灼。 配置<bean class="">
  • Factory hook(勾子) that allows for custom modification of new bean instances, e.g. checking for marker interfaces or wrapping them with proxies.
  • spring提供工廠勾子围段,用于修改實例對象,可以生成代理對象投放,是AOP底層奈泪。
    模擬
A a =new A();
a = B.before(a)         --> 將a的實例對象傳遞給后處理bean,可以生成代理對象并返回灸芳。
a.init();
a = B.after(a);

a.addUser();        //生成代理對象段磨,目的在目標方法前后執(zhí)行(例如:開啟事務(wù)、提交事務(wù))

a.destroy()

6.4.2.1 編寫實現(xiàn)類

public class MyBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("前方法 : " + beanName);
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(final Object bean, String beanName) throws BeansException {
        System.out.println("后方法 : " + beanName);
        // bean 目標對象
        // 生成 jdk 代理
        return Proxy.newProxyInstance(
                    MyBeanPostProcessor.class.getClassLoader(), 
                    bean.getClass().getInterfaces(), 
                    new InvocationHandler(){
                        @Override
                        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                            
                            System.out.println("------開啟事務(wù)");
                            
                            //執(zhí)行目標方法
                            Object obj = method.invoke(bean, args);
                            
                            System.out.println("------提交事務(wù)");
                            return obj;
                        }});
    }
}

6.4.2.2 配置

<!-- 將后處理的實現(xiàn)類注冊給spring -->
    <bean class="com.itheima.e_lifecycle.MyBeanPostProcessor"></bean>
  • 問題1:后處理bean作用某一個目標類耗绿,還是所有目標類?
    所有
  • 問題2:如何只作用一個砾隅?
    通過“參數(shù)2”beanName進行控制

6.5 屬性依賴注入

  • 依賴注入方式:手動裝配 和 自動裝配
  • 手動裝配:一般進行配置信息都采用手動
    基于xml裝配:構(gòu)造方法误阻、setter方法
    基于注解裝配:
  • 自動裝配:struts和spring 整合可以自動裝配
    byType:按類型裝配
    byName:按名稱裝配
    constructor構(gòu)造裝配,
    auto: 不確定裝配晴埂。

6.5.1 構(gòu)造方法

6.5.1.1 目標類

public class User {
    
    private Integer uid;
    private String username;
    private Integer age;
    
    public User(Integer uid, String username) {
        super();
        this.uid = uid;
        this.username = username;
    }
    
    public User(String username, Integer age) {
        super();
        this.username = username;
        this.age = age;
    }

6.5.1.2 spring配置

    <!-- 構(gòu)造方法注入 
        * <constructor-arg> 用于配置構(gòu)造方法一個參數(shù)argument
            name :參數(shù)的名稱
            value:設(shè)置普通數(shù)據(jù)
            ref:引用數(shù)據(jù)究反,一般是另一個bean id值
            
            index :參數(shù)的索引號,從0開始 儒洛。如果只有索引精耐,匹配到了多個構(gòu)造方法時,默認使用第一個琅锻。
            type :確定參數(shù)類型
        例如:使用名稱name
            <constructor-arg name="username" value="jack"></constructor-arg>
            <constructor-arg name="age" value="18"></constructor-arg>
        例如2:【類型type 和  索引 index】
            <constructor-arg index="0" type="java.lang.String" value="1"></constructor-arg>
            <constructor-arg index="1" type="java.lang.Integer" value="2"></constructor-arg>
    -->
    <bean id="userId" class="com.itheima.f_xml.a_constructor.User" >
        <constructor-arg index="0" type="java.lang.String" value="1"></constructor-arg>
        <constructor-arg index="1" type="java.lang.Integer" value="2"></constructor-arg>
    </bean>

6.5.2 setter方法

<!-- setter方法注入 
        * 普通數(shù)據(jù) 
            <property name="" value="值">
            等效
            <property name="">
                <value>值
        * 引用數(shù)據(jù)
            <property name="" ref="另一個bean">
            等效
            <property name="">
                <ref bean="另一個bean"/>
    
    -->
    <bean id="personId" class="com.itheima.f_xml.b_setter.Person">
        <property name="pname" value="陽志"></property>
        <property name="age">
            <value>1234</value>
        </property>
        
        <property name="homeAddr" ref="homeAddrId"></property>
        <property name="companyAddr">
            <ref bean="companyAddrId"/>
        </property>
    </bean>
    
    <bean id="homeAddrId" class="com.itheima.f_xml.b_setter.Address">
        <property name="addr" value="阜南"></property>
        <property name="tel" value="911"></property>
    </bean>
    <bean id="companyAddrId" class="com.itheima.f_xml.b_setter.Address">
        <property name="addr" value="北京八寶山"></property>
        <property name="tel" value="120"></property>
    </bean>

6.5.3 P命令空間[了解]

  • 對“setter方法注入”進行簡化卦停,替換<property name="屬性名">,而是在
    <bean p:屬性名="普通值" p:屬性名-ref="引用值">
  • p命名空間使用前提恼蓬,必須添加命名空間
    <bean id="personId" class="com.itheima.f_xml.c_p.Person" 
        p:pname="禹太璞" p:age="22" 
        p:homeAddr-ref="homeAddrId" p:companyAddr-ref="companyAddrId">
    </bean>
    
    <bean id="homeAddrId" class="com.itheima.f_xml.c_p.Address"
        p:addr="DG" p:tel="東莞">
    </bean>
    <bean id="companyAddrId" class="com.itheima.f_xml.c_p.Address"
        p:addr="DG" p:tel="島國">
    </bean>

6.5.4 SpEL[了解]

  • 對<property>進行統(tǒng)一編程惊完,所有的內(nèi)容都使用value
    <property name="" value="#{表達式}">
    #{123}、#{'jack'} : 數(shù)字处硬、字符串
    #{beanId}   :另一個bean引用
    #{beanId.propName}  :操作數(shù)據(jù)
    #{beanId.toString()}    :執(zhí)行方法
    #{T(類).字段|方法}   :靜態(tài)方法或字段

    <!-- 
        <property name="cname" value="#{'jack'}"></property>
        <property name="cname" value="#{customerId.cname.toUpperCase()}"></property>
            通過另一個bean小槐,獲得屬性,調(diào)用的方法
        <property name="cname" value="#{customerId.cname?.toUpperCase()}"></property>
            ?.  如果對象不為null荷辕,將調(diào)用方法
    -->
    <bean id="customerId" class="com.itheima.f_xml.d_spel.Customer" >
        <property name="cname" value="#{customerId.cname?.toUpperCase()}"></property>
        <property name="pi" value="#{T(java.lang.Math).PI}"></property>
    </bean>

6.5.5 集合注入

<!-- 
        集合的注入都是給<property>添加子標簽
            數(shù)組:<array>
            List:<list>
            Set:<set>
            Map:<map> 凿跳,map存放k/v 鍵值對件豌,使用<entry>描述
            Properties:<props>  <prop key=""></prop>  【】
            
        普通數(shù)據(jù):<value>
        引用數(shù)據(jù):<ref>
    -->
    <bean id="collDataId" class="com.itheima.f_xml.e_coll.CollData" >
        <property name="arrayData">
            <array>
                <value>DS</value>
                <value>DZD</value>
                <value>屌絲</value>
                <value>屌中屌</value>
            </array>
        </property>
        
        <property name="listData">
            <list>
                <value>于嵩楠</value>
                <value>曾衛(wèi)</value>
                <value>楊煜</value>
                <value>曾小賢</value>
            </list>
        </property>
        
        <property name="setData">
            <set>
                <value>停封</value>
                <value>薄紙</value>
                <value>關(guān)系</value>
            </set>
        </property>
        
        <property name="mapData">
            <map>
                <entry key="jack" value="杰克"></entry>
                <entry>
                    <key><value>rose</value></key>
                    <value>肉絲</value>
                </entry>
            </map>
        </property>
        
        <property name="propsData">
            <props>
                <prop key="高富帥">嫐</prop>
                <prop key="白富美">嬲</prop>
                <prop key="男屌絲">挊</prop>
            </props>
        </property>
    </bean>

7 裝配Bean 基于注解

  • 注解:就是一個類,使用@注解名稱
  • 開發(fā)中:使用注解 取代 xml配置文件控嗜。

1. @Component取代<bean class="">

@Component("id") 取代 <bean id="" class="">

2.web開發(fā)茧彤,提供3個@Component注解衍生注解(功能一樣)取代<bean class="">

@Repository :dao層
@Service:service層
@Controller:web層

3.依賴注入 ,給私有字段設(shè)置躬审,也可以給setter方法設(shè)置

普通值:@Value("")
引用值:
    方式1:按照【類型】注入
        @Autowired
    方式2:按照【名稱】注入1
        @Autowired
        @Qualifier("名稱")
    方式3:按照【名稱】注入2
        @Resource("名稱")

4.生命周期

初始化:@PostConstruct
銷毀:@PreDestroy

5.作用域

@Scope("prototype") 多例
  • 注解使用前提棘街,添加命名空間,讓spring掃描含有注解類



<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">
    <!-- 組件掃描承边,掃描含有注解的類 -->
    <context:component-scan base-package="com.itheima.g_annotation.a_ioc">
       </context:component-scan>
</beans>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末遭殉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子博助,更是在濱河造成了極大的恐慌险污,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件富岳,死亡現(xiàn)場離奇詭異蛔糯,居然都是意外死亡,警方通過查閱死者的電腦和手機窖式,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門蚁飒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人萝喘,你說我怎么就攤上這事淮逻。” “怎么了阁簸?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵爬早,是天一觀的道長。 經(jīng)常有香客問我启妹,道長筛严,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任饶米,我火速辦了婚禮桨啃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘檬输。我一直安慰自己优幸,他們只是感情好,可當我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布褪猛。 她就那樣靜靜地躺著网杆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上碳却,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天队秩,我揣著相機與錄音,去河邊找鬼昼浦。 笑死馍资,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的关噪。 我是一名探鬼主播鸟蟹,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼使兔!你這毒婦竟也來了建钥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤虐沥,失蹤者是張志新(化名)和其女友劉穎熊经,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體欲险,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡镐依,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了天试。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片槐壳。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖喜每,靈堂內(nèi)的尸體忽然破棺而出宏粤,到底是詐尸還是另有隱情,我是刑警寧澤灼卢,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站来农,受9級特大地震影響鞋真,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜沃于,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一涩咖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧繁莹,春花似錦檩互、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春饵较,著一層夾襖步出監(jiān)牢的瞬間拍嵌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工循诉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留横辆,地道東北人。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓茄猫,卻偏偏與公主長得像狈蚤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子划纽,可洞房花燭夜當晚...
    茶點故事閱讀 42,834評論 2 345

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理脆侮,服務(wù)發(fā)現(xiàn),斷路器阿浓,智...
    卡卡羅2017閱讀 134,600評論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,748評論 6 342
  • 文章作者:Tyan博客:noahsnail.com 3.4 Dependencies A typical ente...
    SnailTyan閱讀 4,128評論 2 7
  • 同事:“你怎么現(xiàn)在才走,你不是七點半的班嗎退敦?” 我:“嗯粘咖,雖然是早班,但是每天都要加班” 同事:“你吃虧了侈百。既然下...
    叨客晴閱讀 382評論 0 0
  • 好多年沒有在年末寫一篇《年度漢字》了悯周,今年的年度漢字,我第一反應(yīng)赫冬,就是“轉(zhuǎn)”妇萄。 一、對于數(shù)字貨幣的看法 2017年...
    莊表偉閱讀 640評論 1 5