1. set 注入
-
IOC容器,裏面保存並註冊了我們所有的Spring的對象 bean
-
在加載容器的時候,對象就被創建了
- 導入依賴
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
- 編寫實體類,需要set方法
public class User{
private String name;
public void setName(String name){
this.name = name;
}
public void show(){
System.out.println("name="+name);
}
}
- 註冊bean
<bean id="user" class="com.yang.pojo.User">
<property name="name" value="yangkaibo"/>
</bean>
- 測試
@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. 構造器注入
- 導入依賴
- 編寫實體類,不需要set方法
public class User{
private String name;
public User(String name) {
this.name = name;
}
public void show(){
System.out.println("name="+name);
}
}
- 註冊到bean,三種模式
<constructor-arg name="name" value="moji"/>
<!--<constructor-arg index="0" value="moji2"/>-->
<!--<constructor-arg type="java.lang.String" value="moji3"/>-->
- 測試
@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就是在創建對象
- 編寫地址類,使用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;
}
}
- 編寫學生類,提供要寫入的參數類型
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 +
'}';
}
}
- 編寫完整的注入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>
- 測試
4.自動裝配
- 新建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 +
'}';
}
- 編寫user.xml文件,註冊bean
<bean id="dog" class="com.yang.entity.Dog"/>
<bean id="cat" class="com.yang.entity.Cat"/>
<!--<!–<!–<bean id="cat2" class="com.yang.entity.Cat"/>–>–>-->
<!--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>
- 測試
@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/
- 編寫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 +
'}';
}
}
- 註冊bean
<bean id="dog" class="com.yang.entity.Dog"/>
<bean id="cat" class="com.yang.entity.Cat"/>
<!--<!–<!–<bean id="cat2" class="com.yang.entity.Cat"/>–>–>-->
<!--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>
- 測試
6 .使用註解開發
案例1
- 導入 Aop 的包,在導Spring 的包時,AOP的包已經導進去了
- 配置xml配置文件,開啓註解支持
<context:annotation-config/>
<!--@Component相當於bean-->
<context:component-scan base-package="com.yang.pojo"/>
- 在實體類上增加註釋
//相當於bean
@Component("user")
@Scope("prototype")
/*
* @Component("user") <bean id=user/>
* dao 等價 @Repository
* service 等價 @Service
* contrller 等價 @Controller
* */
public class User {
@Value("yang")
public String name;
}
- 測試
案例2
-
新建一個maven空項目
-
建立實體pojo包 和 配置文件config包
-
利用標籤創建實體類
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();
}
}
- 測試
public class Testnew {
@Test
public void test1(){
ApplicationContext context = new AnnotationConfigApplicationContext(ApplicationContext2.class);
Dog dog = (Dog) context.getBean("dog");
System.out.println(dog.name);
}
}