spring------IOC注入,註解開發,自動裝配

1. set 注入

  • IOC容器,裏面保存並註冊了我們所有的Spring的對象 bean

  • 在加載容器的時候,對象就被創建了

  1. 導入依賴
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.1.9.RELEASE</version>
</dependency>
  1. 編寫實體類,需要set方法
public class  User{
    private  String name;
    public void setName(String name){
       this.name = name;
    }
    public void show(){
        System.out.println("name="+name);
    }
}
  1. 註冊bean
<bean id="user" class="com.yang.pojo.User">
    <property name="name" value="yangkaibo"/>
</bean>
  1. 測試
@Test
public void test3(){
    //IOC容器,裏面保存並註冊了我們所有的Spring的對象 bean
    //在加載容器的時候,對象就被創建了
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

    System.out.println("------------------------");

    User user = (User)context.getBean("user");
    user.show();
}

2. 構造器注入

  1. 導入依賴
  2. 編寫實體類,不需要set方法
public class  User{
    private  String name;

    public User(String name) {
        this.name = name;
    }

    public void show(){
        System.out.println("name="+name);
    }
}
  1. 註冊到bean,三種模式
<constructor-arg name="name" value="moji"/>
<!--<constructor-arg index="0" value="moji2"/>-->
<!--<constructor-arg type="java.lang.String" value="moji3"/>-->
  1. 測試
@Test
public void test3(){
    //IOC容器,裏面保存並註冊了我們所有的Spring的對象 bean
    //在加載容器的時候,對象就被創建了
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

    System.out.println("------------------------");

    User user = (User)context.getBean("user");
    user.show();
}
<bean id="user" class="com.yang.pojo.User">
    <!--<property name="name" value="yangkaibo"/>-->
    <constructor-arg name="name" value="moji"/>
    <constructor-arg name="user" ref="moji"/>
</bean>
<!--如果是對象的話,用ref引用,其他的用value-->

<bean id="moji" class="com.yang.pojo.User">
    
</bean>

起別名的操作,憑自願


<alias name="user" alias="yonghu"/>

import在多人協作中,通過import進行導入bean

<!--在多人協作中,通過import進行導入bean-->
<import resource="student.xml"/>

3.完善注入信息,bean就是在創建對象

  1. 編寫地址類,使用get set方法
package com.yang.pojo;

public class Address {
    private  String  address;

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}
  1. 編寫學生類,提供要寫入的參數類型
package com.yang.pojo;

import java.util.*;

public class Student {

    private  String  name;
    private  Address address;
    private  String[] books;
    private List<String> list;
    private Map<String,String> map;
    private Set<String> set;
    private  String wife;
    private Properties info;//配置類

    public void setName(String name) {
        this.name = name;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    public void setBooks(String[] books) {
        this.books = books;
    }

    public void setList(List<String> list) {
        this.list = list;
    }

    public void setMap(Map<String, String> map) {
        this.map = map;
    }

    public void setSet(Set<String> set) {
        this.set = set;
    }

    public void setWife(String wife) {
        this.wife = wife;
    }

    public void setInfo(Properties info) {
        this.info = info;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", address=" + address.getAddress() +
                ", books=" + Arrays.toString(books) +
                ", list=" + list +
                ", map=" + map +
                ", set=" + set +
                ", wife='" + wife + '\'' +
                ", info=" + info +
                '}';
    }
}
  1. 編寫完整的注入xml
<?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
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="addr" class="com.yang.pojo.Address">
        <property name="address" value="西安"/>
    </bean>
    <!--<bean id="user" class="com.yang.pojo.User">-->
         <!--<property name="name" value="yao"/>-->
    <!--</bean>-->
    <!--scope 屬性
singleton :在容器中只有一個對象(默認的,單例)
prototype :每次創建新對象
request/session 只在web中使用
-->
    <bean id="student" class="com.yang.pojo.Student" scope="singleton">
        <!--常量-->
        <property name="name" value="楊凱波"/>
        <!--引用類型-->
        <property name="address" ref="addr"/>
        <!--數組類型-->
        <property name="books">
            <array>
                <value>西遊記</value>
                <value>水滸傳</value>
                <value>紅樓夢</value>
            </array>
        </property>

        <property name="list">
            <list>
                <value>list1</value>
                <value>list2</value>
                <value>list3</value>
            </list>
        </property>
        <property name="map">
            <map>
                <entry key="key1" value="v1"/>
                <entry key="key2" value="v2"/>
            </map>
        </property>

        <property name="set">
            <set>
                <value>set1</value>
                <value>set2</value>
                <value>set3</value>
            </set>
        </property>
        <property name="wife">
            <null/>
        </property>

        <property name="info">
            <props>
                <prop key="id">100</prop>
                <prop key="name">yaoyao</prop>
                <prop key="sex">mybaby</prop>
            </props>
        </property>
    </bean>

</beans>
  1. 測試

4.自動裝配

  1. 新建entity包,創建三個實體類
public class Cat {
    public void shot(){
        System.out.println("我的");
    }
}
public class Dog {
    public void shut(){
        System.out.println("對啊,你的");
    }
}
private String name;
private Cat cat;
private Dog dog;

public void setName(String name) {
    this.name = name;
}

public void setCat(Cat cat) {
    this.cat = cat;
}

public void setDog(Dog dog) {
    this.dog = dog;
}

public String getName() {
    return name;
}

public Cat getCat() {
    return cat;
}

public Dog getDog() {
    return dog;
}

@Override
public String toString() {
    return "User{" +
            "name='" + name + '\'' +
            ", cat=" + cat +
            ", dog=" + dog +
            '}';
}
  1. 編寫user.xml文件,註冊bean
<bean id="dog" class="com.yang.entity.Dog"/>
<bean id="cat" class="com.yang.entity.Cat"/>
<!--&lt;!&ndash;&lt;!&ndash;<bean id="cat2" class="com.yang.entity.Cat"/>&ndash;&gt;&ndash;&gt;-->
<!--autowire="byName":自動配置 會自動尋找和屬性相關的bean,本質是set方法-->
<!--autowire="byType":自動配置 會自動尋找和屬性相關的bean,本質是set方法
如果這個類型有多個bean,就會報NoUniqueBeanDefinitionException錯誤,好理解,就是同一個類創建了多個對象,按照對象劃分肯定是不行的-->

<bean id="user" class="com.yang.entity.User"  autowire="byName">
     <!--<property name="cat" ref="cat"/>-->
     <!--<property name="dog" ref="dog"/>-->
     <property name="name" value="yangkaibo"/>
</bean>
  1. 測試
@Test
public void test5(){
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

    User user = (User) context.getBean("user");

    System.out.println(user);
    user.getCat().shot();
    user.getDog().shut();
}

5.自動裝配

爲了支持註解,在applicationContext.xml文件中引入新的約束文件
1.增加 xmlns:context=“http://www.springframework.org/schema/context”
2.增加 http://www.springframework.org/schema/context
3開啓註解支持 context:annotation-config/

  1. 編寫User類增加註解
public class User {
    private String name;
    @Autowired
    // @Qualifier("cat2")//組合註解,指定注入
    private Cat cat;
    //自動裝配,默認按照byName來查找,如果byName不對,也會按照類型來查找
    //required = false  表示允許對象爲null,默認爲true;
    //spring的註解
    @Resource//java的註解
    private Dog dog;
    
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public Cat getCat() {
        return cat;
    }
    public Dog getDog() {
        return dog;
    }
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", cat=" + cat +
                ", dog=" + dog +
                '}';
    }

}
  1. 註冊bean
<bean id="dog" class="com.yang.entity.Dog"/>
<bean id="cat" class="com.yang.entity.Cat"/>
<!--&lt;!&ndash;&lt;!&ndash;<bean id="cat2" class="com.yang.entity.Cat"/>&ndash;&gt;&ndash;&gt;-->
<!--autowire="byName":自動配置 會自動尋找和屬性相關的bean,本質是set方法-->
<!--autowire="byType":自動配置 會自動尋找和屬性相關的bean,本質是set方法
如果這個類型有多個bean,就會報NoUniqueBeanDefinitionException錯誤,好理解,就是同一個類創建了多個對象,按照對象劃分肯定是不行的-->
<bean id="user" class="com.yang.entity.User">
     <!--<property name="cat" ref="cat"/>-->
     <!--<property name="dog" ref="dog"/>-->
     <property name="name" value="yangkaibo"/>
</bean>
  1. 測試

6 .使用註解開發

案例1

  1. 導入 Aop 的包,在導Spring 的包時,AOP的包已經導進去了
  2. 配置xml配置文件,開啓註解支持
<context:annotation-config/>
<!--@Component相當於bean-->
<context:component-scan base-package="com.yang.pojo"/>
  1. 在實體類上增加註釋
//相當於bean
@Component("user")
@Scope("prototype")
/*
* @Component("user")  <bean id=user/>
* dao          等價     @Repository
* service      等價     @Service
* contrller    等價     @Controller
* */
public class User {
    @Value("yang")
    public  String name;
}
  1. 測試

案例2

  1. 新建一個maven空項目

  2. 建立實體pojo包 和 配置文件config包

  3. 利用標籤創建實體類

package com.yang.pojo;


import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
//配置類
@Configuration//等價於Dog.xml
public class Dog {
    @Value("樂樂")
    public String name;


}
package com.yang.config;

import com.yang.pojo.Dog;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration//標註是配置文件
@Import(MyConfig.class)//等價於import標籤
public class ApplicationContext2 {
    //返回一個bean  id=方法名,  class = 具體返回的對象
    @Bean
    public Dog dog(){
        return new Dog();
    }
}
  1. 測試
public class Testnew {
   @Test
    public void test1(){
       ApplicationContext context = new AnnotationConfigApplicationContext(ApplicationContext2.class);
       Dog dog = (Dog) context.getBean("dog");

       System.out.println(dog.name);
   }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章