第一种 使用构造器注入
使用构造器注入时,类必须要有构造方法,成员变量的setter方法不需要。
User类
public class User {
private String name;
private Integer age;
//构造方法
public User() {
}
public User(String name, Integer age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}
}
beans.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
http://www.springframework.org/schema/beans/spring-beans.xsd" default-lazy-init="true">
<!-- 使用构造方法注入 -->
<bean id="user" class="demo.User">
<constructor-arg index="0" value="Jack"></constructor-arg>
<constructor-arg index="1" value="20"></constructor-arg>
</bean>
</beans>
Test类测试
public class Test {
public static void main(String[] args) {
//1 实例化Spring工厂
ApplicationContext act=new ClassPathXmlApplicationContext("beans3.xml");
//获取User对象
User user=(User) act.getBean("user");
System.out.println(user.toString());
}
}
测试结果
十月 15, 2019 11:49:06 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@7eda2dbb: startup date [Tue Oct 15 23:49:06 CST 2019]; root of context hierarchy
十月 15, 2019 11:49:06 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [beans3.xml]
User [name=Jack, age=20]
第二种 使用属性setter方法注入
使用属性setter方法注入时,类的成员变量必须要有setter方法。
Demo类
public class Demo {
private String str;//基本类型
private Integer num;
private String[] strs;//数组
private Integer[] nums;
private Double db;
private User user;//引用类型
private List<String> list;//List
private Map<String,Integer> map;//Map
private Set<String> set;//Set
private Properties properties;//Properties
public void setStr(String str) {
this.str = str;
}
public void setNum(Integer num) {
this.num = num;
}
public void setStrs(String[] strs) {
this.strs = strs;
}
public void setNums(Integer[] nums) {
this.nums = nums;
}
public void setDb(Double db) {
this.db = db;
}
public void setUser(User user) {
this.user = user;
}
public void setList(List<String> list) {
this.list = list;
}
public void setMap(Map<String, Integer> map) {
this.map = map;
}
public void setSet(Set<String> set) {
this.set = set;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
@Override
public String toString() {
return "Demo [str=" + str + ", num=" + num + ", strs=" + Arrays.toString(strs) + ", nums=" + nums + ", db=" + db
+ ", user=" + user + ", list=" + list + ", map=" + map + ", set=" + set + ", properties=" + properties
+ "]";
}
}
beans.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
http://www.springframework.org/schema/beans/spring-beans.xsd" default-lazy-init="true">
<!-- 使用构造方法注入 -->
<bean id="user" class="demo.User">
<constructor-arg index="0" value="Jack"></constructor-arg>
<constructor-arg index="1" value="20"></constructor-arg>
</bean>
<!-- 使用属性setter方法注入 -->
<bean id="demo" class="demo.Demo">
<property name="str" value="字符串"></property>
<property name="num" value="123"></property>
<!-- 数组依赖注入 -->
<property name="strs">
<array>
<value>字符串数组元素1</value>
<value>字符串数组元素2</value>
<value>字符串数组元素3</value>
</array>
</property>
<property name="nums">
<array>
<value>10</value>
<value>20</value>
<value>30</value>
</array>
</property>
<property name="db" value="123.3"></property>
<!-- 这里的user注入依赖构造器的user -->
<property name="user" ref="user"></property>
<!-- 对List注入注意的地方 -->
<property name="list">
<list>
<value>list1</value>
<value>list2</value>
</list>
</property>
<!-- 对Map注入注意的地方 -->
<property name="map">
<map>
<entry key="map1" value="1"></entry>
<entry key="map2" value="2"></entry>
<entry key="map3" value="3"></entry>
</map>
</property>
<!-- 对Set注入注意的地方 -->
<property name="set">
<set>
<value>set1</value>
<value>set2</value>
<value>set3</value>
</set>
</property>
<!-- 对Properties注入注意的地方 -->
<property name="properties">
<props>
<prop key="key1">prop1</prop>
<prop key="key2">prop2</prop>
</props>
</property>
</bean>
</beans>
Test类测试
public class Test {
public static void main(String[] args) {
//1 实例化Spring工厂
ApplicationContext act=new ClassPathXmlApplicationContext("beans3.xml");
//获取Demo对象
Demo demo=(Demo) act.getBean("demo");
System.out.println(demo.toString());
}
}
测试结果
十月 16, 2019 12:22:00 上午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@7eda2dbb: startup date [Wed Oct 16 00:22:00 CST 2019]; root of context hierarchy
十月 16, 2019 12:22:00 上午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [beans3.xml]
Demo [str=字符串, num=123, strs=[字符串数组元素1, 字符串数组元素2, 字符串数组元素3], nums=[Ljava.lang.Integer;@20398b7c, db=123.3, user=User [name=Jack, age=20], list=[list1, list2], map={map1=1, map2=2, map3=3}, set=[set1, set2, set3], properties={key2=prop2, key1=prop1}]
第三种 使用Field注入(用于注解方式)
使用Field注入时,需要导入spring-aop-4.1.7.RELEASE.jar包,一定要喝咖啡(add to Build path)。
beans.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"
xmlns:context="http://www.springframework.org/schema/context"
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-2.5.xsd">
<!-- 开启自动扫描 -->
<context:component-scan base-package="com"></context:component-scan>
<!-- 这里指对com下的包的类进行扫描 -->
</beans>
beanx.xml配置与前两个依赖注入的方式不一样。
四个类注解方式
@Service用于标注业务层组件
@Controller用于标注控制层组件(如struts中的 action)
@Repository用于标注数据访问组件,即DAO组件
@Component泛 指组件,当组件不好归类的时候,可以使用这个注解进行标注
两个类的成员注解方式
@Autowired注解是按类型装配依赖对象,默认情况下它要求依赖对象必须存 在,如果允许null值,可以设置它required属性为false。 如果我们想使用按名称装配,可以结合@Qualifier注解一起使用。
如下: @Autowired @Qualifier("personDaoBean")
private PersonDao personDao;
@Resource注解和@Autowired一样,也可以标注在字段或属性的 setter方法上,但它默认按名称装配。 名称可以通过@Resource的name属性指定,如果没有指定name属性, 当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对 象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称 寻找依赖对象。
@Resource(name=“personDaoBean”)
private PersonDao personDao;//用于字段上
注意:如果没有指定name属性,并且按照默认的名称仍然找不到依赖 对象时, @Resource注解会回退到按类型装配。但一旦指定了name属 性,就只能按名称装配了。
@Autowired使用比较多
1 @Autowired可以允许非空
2 @Resource来源于Jdk下的javax.annotation包,不属于Spring,@Autowired解耦合。
对UserDao注解
package com.dao;
import org.springframework.stereotype.Repository;
@Repository
public class UserDao {
public UserDao() {
System.out.println("UserDao()......");
}
public void testDao() {
System.out.println("执行testDao()方法。。。。。。");
}
}
对UserService注解
package com.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.dao.UserDao;
@Service
public class UserService {
@Autowired(required = false)//允许位null
private UserDao userdao;
public UserService() {
System.out.println("UserService()......");
}
public void testService() {
System.out.println("执行testService()方法。。。。。。");
userdao.testDao();
}
}
对UserServlet注解
package com.servlet;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import com.service.UserService;
@Controller
public class UserServlet {
@Autowired(required = false)//允许位null
private UserService userService;
public UserServlet() {
System.out.println("UserServlet()......");
}
public void testServlet() {
System.out.println("执行testServlet()方法。。。。。。");
userService.testService();
}
}
Test类测试
public class Test {
public static void main(String[] args) {
//实例化Spring工厂
ApplicationContext act=new ClassPathXmlApplicationContext("beans4.xml");
UserServlet servlet=(UserServlet) act.getBean("userServlet");
servlet.testServlet();
}
}
测试结果
十月 16, 2019 12:56:55 上午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@76fb509a: startup date [Wed Oct 16 00:56:55 CST 2019]; root of context hierarchy
十月 16, 2019 12:56:55 上午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [beans4.xml]
UserDao()......
UserService()......
UserServlet()......
执行testServlet()方法。。。。。。
执行testService()方法。。。。。。
执行testDao()方法。。。。。。
通过注解方式进行依赖注入,可以省去写beans.xml的bean标签,大大提高开发效率以及减少创建和编辑beans.xml文件的时间。