1. 程式人生 > >Spring 學習筆記(四)IOC之註解方式

Spring 學習筆記(四)IOC之註解方式

用註解向IOC容器增加javaBean配置,還有一些注入的註解

第一步:添加註解的jar包

spring-aop-4.3.3.RELEASE.jar

第二步:applicationContext.xml檔案中開啟註解

注意beans標籤內增加了context的名稱空間和約束

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       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
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">

    <!--引入context的名稱空間-->
    <!--開啟註解,配置要掃描的包-->
    <context:component-scan base-package="org.spring.exampleAOP" />
</beans>

第三步:就可以使用註解嘍

  • 建立物件,四種註解的效果是一樣的,估計就是傳說中的約定吧
  1. @Component  建立物件 普通Spring專案
  2. @Repository   建立物件 持久層  分層專案
  3. @Service        建立物件 Service層   分層專案
  4. @Controll       建立物件 web層   分層專案

@Scope("引數"),還是單例/多例/session/request的意思

@Component //相當於bean標籤, beanName預設首字母小寫
@Scope("singleton") //等同bean標籤中的scope
public class Sadamu implements People {
  • 注入

1. 普通注入:@Value("${people}"),支援EL表示式, 這個用的挺多的還,比如專案中經常在配置檔案中設定全域性變數啥的(比如站點名稱、jdbc配置啥的)

現在applicationContext.xml中裝入properties檔案,然後EL表示式就可以取到啦。

 <!--裝入配置檔案 properties-->
    <context:property-placeholder location="classpath:my.properties" />

2. 物件注入

@Autowired 自動裝配(按型別) , 可以在描述介面,自動裝配一個介面的實現類, 只能是一個,不能沒有實現類。

當出現多個實現類的時候,必須用@Qualifer(value="XXX")註解進行說明要注入哪個實現類,否則會報錯。

@Component //相當於bean標籤, beanName預設首字母小寫
@Scope("singleton") //等同bean標籤中的scope
public class Sadamu implements People {

    //自動裝載,自動根據變數型別進行注入, 如果IOC容器沒有這個類就會報錯, 有多個也不行
    @Autowired
    @Qualifier(value = "kazhafei") //當Autowired出現多個實現的時候, 必須用Qualifier指定注入名稱
    public People people;

@Resource 註解是@Autowired和@Qualifer註解的合體,既能按型別注入也能按名稱注入,推薦使用

    @Resource(name = "kazhafei") //@Autowired(根據型別注入)和@Qualifier(選擇名稱)兩個註解的合體,
    public Kazhafei kazhafei;

另:@Autowired來自spring,@Resource來自javaEE

package org.springframework.beans.factory.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
    boolean required() default true;
}
-----------------------------------------------------------------------------
package javax.annotation;

import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*; 
@Target({TYPE, FIELD, METHOD})
@Retention(RUNTIME)
public @interface Resource {....
  • 其他註解(部分,日後慢慢填吧)
    @PostConstruct //初始化方法註解
    public void init(){
        System.out.println("IOCinit:薩達姆初始化");
    }

    @PreDestroy  //銷燬方法註解
    public void destroy(){
        System.out.println("IOCdestroy:薩達姆銷燬");
    }