天天看點

Sprint set自動注入 構造器注入 注解

1、set自動注入

bean有個屬性 autowire autowire”byType”

自己去找對應的注入。也就是把原來的

<bean id="s1" class="bean.Student">
    <!-- 利用set注入 -->

    <property name="c" ref="p1" ></property>
    <property name="p" ref="p2"></property>

    </bean>
           

改成如下: 用autowire屬性代替

<bean id="s2" class="bean.Student" autowire="byType">
    </bean>
           
Student s2 = ac.getBean("s2",Student.class);

        s2.show();
           

就會去上面找,對應的屬性值傳入。

但是要注意!有且隻有一個。不然要報錯。

也就是靠這個類型的,但是多個的話Spring就不知道傳哪個了。

還有屬性值byName就是按id是對應的

2、各種類型資訊的注入配置格式

a.注入字元串,數值單個數值

因為從xml讀出來的都是字元串。如果指派的是int類型。Spring會幫助我們自動轉換成int類型。但是不能轉換的就不行了。比如age在xml中寫的是abc就不行了。會報錯。同樣日期類型輸入的不是Date的就會報錯。要把配置的字元串轉成date。如果一定要配置2016-12-19 那麼就自己在set方法中設定我們給其轉換。

b.注入bean對象

c.注入集合list,set,map,properties

注入list:

<property name=”list1”>
<list>
<value>tom</value>
<value>jack</value>
</list>
</property>
           

這個就會幫你建立list,裡面的值是tom,jack 然後注入給llist1

如果想傳入空值 null

就寫

那麼類中建立出來後name的值就是null了。沒有寫value屬性寫了null标簽。

list中注入bean

set類似

Map:

<map>
<entry key=”1001” value=”java”>
<entry key=”1002” value=”python”>

</map>
           

Properties注入 這個類型繼承了HashTable

常用于一些連接配接資料庫的資訊

注入:

<property name=”db”>
<props>
<prop key=”username”>root</prop>
<prop key=”password”>root</prop>
<prop key=”driver”>com.mysql.jdbc.Driver</prop>
</props>
</property>
           

然後:

Set<Object> keys = db.keySet();
for(Object key:keys){
System.out.println(key+”:”+db.getProperty(key.toString));
}
           
<!-- 定義list<String>對象 -->
    <util:list id="somelist">
    <value>qwe</value>
    <value>asd</value>

    </util:list>
           

然後可以将這個建立的list注入給bean

注意 用的是ref

property也可以從外部讀取,建一個property檔案來讀取。

建立 db.property

寫入:

user=root
password=root
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:/test
           

在配置中寫:

<util:property id=”dbParams” location=”classpath:db.property”>

</util:property >
           

//classpath也就是說從src找

location指向讀取這個檔案。

而且也可以在bean中讀取。在

value=”#{dbParams.user}”

這個dbParams就是上面的id。

這麼寫就是表達式注入

發現自己的se方面的有些忘了。要複習了!

class=”bean.xxx”

這個class指明的是bean的名稱。帶上包名

後面的

<property>

是set注入,其屬性的name對應的是bean的屬性名,value對應的是給這個name屬性注入屬性值

傳入list時時在property标簽下寫

<list>

标簽。list标簽下寫value标簽,value标簽裡面是這個list的每一個元素。

d.Spring表達式注入(把目前對象的屬性提取出來在注入到别的對象中)

#{表達式}
#{id名.屬性}或者#{id名.key}
           

如果是對象屬性,需要有get方法。因為屬性定義的是私有的。用公有的get去擷取。

那個表達式就和jsp中的一樣。${表達式}和#{表達式}裡面的表達式是一樣的。

也就是說表達式注入可以把目前的對象的屬性的值注入到别的對象中的屬性中去。

3.利用注解配置應用IOC

在JDK5.0時追加一些新特性

List比如這個泛型。還有新式for循環

注解:在類定義,方法定義,成員變量定義前面使用。

格式為 @注解标記名

a.元件自動掃描

可以按指定的包路徑,将包下所有元件掃描,如果發現元件類定義前有以下标記,會将元件掃描到Spring容器就是幫你寫

<bean>

@Component //其他元件

@Controller// 控制層元件 一般使用MVC架構時用到

@Service // 業務層元件

@Repository // 資料通路層元件Dao

@Named(需要引入第三方标準包)

先寫一個bean類。比如裡面就寫個輸出。

package Bean;

import org.springframework.stereotype.Component;

@Component //掃描ExampleBean元件。預設id=exampleBean
public class ExampleBean {

    public void execute(){
        System.out.println("執行execute處理方法!");
    }
}
           

然後在配置檔案中寫:

<!-- 開啟元件掃描 -->
<context:component-scan base-package="Bean"></context:component-scan>
           

測試類;

package test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import Bean.ExampleBean;

public class test {

    public static void main(String[] args) {
        String conf ="applicationContext.xml";
        ApplicationContext ac = new ClassPathXmlApplicationContext(conf);

        ExampleBean eb = ac.getBean("exampleBean",ExampleBean.class);
        eb.execute();
    }

}
           
Sprint set自動注入 構造器注入 注解

getBean()方法調用成功。

不管在寫多少個Bean類,隻有把路徑寫入配置檔案就可以了。一個包路徑下可以寫很多個。

如果想自己指定這個id名那麼

@Component(“example1”)

Sprint set自動注入 構造器注入 注解

在把測試類中的getBean改了就可以同樣使用了。

自己寫

<bean>

的話有很多屬性 id class init-method scope等

注解當然那麼建立的也可以就是比如:使用 scope屬性

@Scope(“prototype”)

就再添加一個@Scope就可以了,屬性值就再括号裡寫。

初始化和銷毀的話就再其方法前寫:

@PostConstruct//等價于<bean init-method="">
    public void init(){
        System.out.println("初始化!");
    }
    @PreDestroy//等價于<bean destory-method="">
    public void destroy(){
        System.out.println("銷毀!");
    }
           

常用的就是把它掃描進去,然後控制其屬性是否是單例

@Scope控制對象建立

@PostConstruct指定init-method

@PreDestroy指定destroy-method

b.注入注解

@Resource可以寫在set方法前和屬性前 将其注入

也可以用@Autowired用法一樣。作用相同。

如果用注解的方法加上@Resource連set方法都可以不用寫。

@Resource//預設按名稱,如果按名稱找不到對應名稱的則按類型。

@Autowired是按類型

一般使用時,功能等價,都可以實作注入。

如果不存在多個比對類型,都可以使用。

如果存在多個比對類型就可以用指定名字的方式

@Autowired

加個@Qualifier(“強制指定的名字”)

也可以

@Resource(name=”指定名字”)//也就是說那這個指定的名字比對

配置還是:

<!-- 開啟元件掃描 -->
<context:component-scan base-package="Bean"></context:component-scan>
           

Computer.java

package Bean;

import org.springframework.stereotype.Component;

@Component
public class Computer {
    private String cpu;

    public void show(){
        System.out.println("顯示計算機資訊");

    }
}
           

Phone.java

package Bean;
import org.springframework.stereotype.Component;

@Component
public class Phone {
    private String cpu;

    public void show(){
        System.out.println("顯示手機資訊");
    }
}
           

Student.java

package Bean;
import javax.annotation.Resource;

import org.springframework.stereotype.Component;

@Component
public class Student {
    //需要調用Computer和Phone對象
    @Resource
    private Computer c;//注入Computer對象
    @Resource
    private Phone p;//注入Phone對象

        public void setC(Computer c) {
        this.c = c;
    }

    public void setP(Phone p) {
        this.p = p;
    }

        public void show(){
            System.out.println("顯示學生資訊:");
            c.show();
            p.show();
        }
}


        Computer c = ac.getBean("computer",Computer.class);
        c.show();

        Phone p = ac.getBean("phone",Phone.class);
        p.show();

        Student s = ac.getBean("student",Student.class);
        s.show();

           
Sprint set自動注入 構造器注入 注解

繼續閱讀