Spring框架简介⑤

七 依赖注入

1 常量注入

User类

package com.rl.spring.model;

public class User {
	
	private Integer userId;
	
	private String username;
	
	private String password;
	
	public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public User() {
		System.out.println("user被创建");
	}

	public void init(){
		System.out.println("我出来了");
	}
	public void destroy(){
		System.out.println("20年后又是一条好汉");
	}
	
	public Integer getUserId() {
		return userId;
	}

	public void setUserId(Integer userId) {
		this.userId = userId;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

    @Override
    public String toString() {
        return "User [userId=" + userId + ", username=" + username + ", password=" + password + "]";
    }
}

配置文件:

<?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-3.2.xsd">

	<bean id="user" class="com.rl.spring.model.User">
	   <property name="userId" value="1"></property>
	   <property name="username" value="lijialin"></property>
	   <property name="password" value="123"></property>
	</bean>
	
</beans>

测试类:

package com.rl.spring.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.rl.spring.model.User;

public class TestSpring {

	@Test
	public void test() {
		ApplicationContext ctx =
				new ClassPathXmlApplicationContext("ApplicationContext.xml");
		User user = (User) ctx.getBean("user");
		System.out.println(user);
	}
}

测试输出:

User [userId=1, username=lijialin, password=123]

2 构造器注入

注入常量

User类: 在该类中添加有参构造器, 同时需要添加无参构造器

扫描二维码关注公众号,回复: 2714899 查看本文章
package com.rl.spring.model;

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

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

	public void init(){
		System.out.println("我出来了");
	}
	public void destroy(){
		System.out.println("20年后又是一条好汉");
	}
	
	public Integer getUserId() {
		return userId;
	}

	public void setUserId(Integer userId) {
		this.userId = userId;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

    @Override
    public String toString() {
        return "User [userId=" + userId + ", username=" + username + ", password=" + password + "]";
    }
}

配置文件:

<?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-3.2.xsd">

	<bean id="user" class="com.rl.spring.model.User">
	<!-- 
	   index是指构造方法中的参数的索引, 从0开始
	   value是值
	 -->
	   <constructor-arg index="0" value="1"/>
	   <constructor-arg index="1" value="lijialin"/>
	   <constructor-arg index="2" value="123"/>
	</bean>
</beans>

测试输出:

User [userId=1, username=lijialin, password=123]

注入变量

UserServiceImpl类:

需要在UserServiceImpl类中提供有参和无参的构造方法

package com.rl.spring.service.impl;

import com.rl.spring.dao.UserDao;
import com.rl.spring.service.UserService;

public class UserServiceImpl implements UserService {

	private UserDao userDao;
	
	public UserServiceImpl() {
    }
	
	public UserServiceImpl(UserDao userDao) {
        super();
        this.userDao = userDao;
    }

    @Override
	public void save() {
		userDao.save();
	}

}

配置文件:

<?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-3.2.xsd">


    <bean id="userDao" class="com.rl.spring.dao.impl.UserDaoImpl"></bean>
    
    <!-- 
        index: 参数只有一个UserDao 索引为0
        type: UserDao的包路径(需要是接口的包路径)
        ref: 引入的userDao的bean的id
     -->
    <bean id="userService" class="com.rl.spring.service.impl.UserServiceImpl">
        <constructor-arg index="0" type="com.rl.spring.dao.UserDao" ref="userDao" />
    </bean>
</beans>

测试代码:

package com.rl.spring.test;

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

import com.rl.spring.service.UserService;

public class TestSpring {

	@Test
	public void test() {
		ApplicationContext ctx =
				new ClassPathXmlApplicationContext("ApplicationContext2.xml");
		
		UserService userService = (UserService) ctx.getBean("userService");
		
		userService.save();
	}
}

输出:

user被保存了

3 外部bean注入(最常用的注入方式)

外部bean的注入方式必须在UserServiceImpl类中提供set...方法

UserServiceImpl类:

package com.rl.spring.service.impl;

import com.rl.spring.dao.UserDao;
import com.rl.spring.service.UserService;

public class UserServiceImpl implements UserService {

	private UserDao userDao;
	
	public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
	
    @Override
	public void save() {
		userDao.save();
	}

}

配置文件:

<?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-3.2.xsd">

    <bean id="userDao" class="com.rl.spring.dao.impl.UserDaoImpl"></bean>

    <!-- 
        name: UserServiceImpl类中的userDao属性
        ref: 引入上面userDao这个bean
     -->
    <bean id="userService" class="com.rl.spring.service.impl.UserServiceImpl">
        <property name="userDao" ref="userDao"></property>
    </bean>

</beans>

测试代码跟输出结果同上

4 内部bean注入(较少使用)

UserServiceImpl类跟同上需要set方法

配置文件:

<?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-3.2.xsd">

    <!-- 内部bean的注入形式
                缺点是无法再给其他bean引用
     -->
    <bean id="userService" class="com.rl.spring.service.impl.UserServiceImpl">
        <property name="userDao">
            <bean class="com.rl.spring.dao.impl.UserDaoImpl"></bean>
        </property>
    </bean>
    
</beans>

测试代码和输出同上

5 集合注入

集合注入能够注入 set list map property

创建一个新的类CollectionInjection

package com.rl.spring.model;

import java.util.Set;

public class CollectionInjection {

    private Set<String> set;

    public Set<String> getSet() {
        return set;
    }

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

配置文件:

<?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-3.2.xsd">

    <bean id="ci" class="com.rl.spring.model.CollectionInjection">
    <!-- 属性set -->
        <property name="set">
            <set>
            <!-- 给集合赋值 -->
                <value>football</value>
                <value>basketball</value>
            </set>
        </property>
    </bean>
    
</beans>

测试代码:

package com.rl.spring.test;

import java.util.Set;

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

import com.rl.spring.model.CollectionInjection;
import com.rl.spring.service.UserService;

public class TestSpring {

	@Test
	public void test() {
		ApplicationContext ctx =
				new ClassPathXmlApplicationContext("ApplicationContext5.xml");
		CollectionInjection ci = (CollectionInjection) ctx.getBean("ci");
		Set<String> set = ci.getSet();
		System.out.println(set);
	}
}

输出结果:

[football, basketball]

list集合跟set集合相同

map集合跟list跟set集合的用法类似, 区别在于配置文件有些许不同

配置文件:

<?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-3.2.xsd">

    <bean id="ci" class="com.rl.spring.model.CollectionInjection">
    <!-- 属性set -->
        <property name="set">
            <set>
            <!-- 给集合赋值 -->
                <value>football</value>
                <value>basketball</value>
            </set>
        </property>
        
        <property name="map">
            <map>
                <entry key="key1" value="value1"></entry>
                <entry key="key2" value="value2"></entry>
            </map>
        </property>
    </bean>
    
</beans>

测试代码也跟set和list类似

输出:

{key1=value1, key2=value2}

Properties

配置文件:

<?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-3.2.xsd">

    <bean id="ci" class="com.rl.spring.model.CollectionInjection">
    <!-- 属性set -->
        <property name="set">
            <set>
            <!-- 给集合赋值 -->
                <value>football</value>
                <value>basketball</value>
            </set>
        </property>
        
        <property name="map">
            <map>
                <entry key="key1" value="value1"></entry>
                <entry key="key2" value="value2"></entry>
            </map>
        </property>
        
        <property name="prop">
            <props>
                <prop key="name">lijialin</prop>
                <prop key="job">讲师</prop>
            </props>
        </property>
    </bean>
    
</beans>

测试代码:

package com.rl.spring.test;

import java.util.Map;
import java.util.Properties;

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

import com.rl.spring.model.CollectionInjection;

public class TestSpring {

	@Test
	public void test() {
		ApplicationContext ctx =
				new ClassPathXmlApplicationContext("ApplicationContext5.xml");
		CollectionInjection ci = (CollectionInjection) ctx.getBean("ci");
//		Set<String> set = ci.getSet();
//		Map<String, String> map = ci.getMap();
		Properties prop = ci.getProp();
		System.out.println(prop);
	}
}

输出结果:

{name=lijialin, job=讲师}

猜你喜欢

转载自blog.csdn.net/ip_JL/article/details/81478763