package com.spring.chapter4.dao;
public interface FruitDao {
public void create();
}
//Dao层实现类:
package com.spring.chapter4.dao.impl;
import com.spring.chapter4.dao.FruitDao;
public class FruitDaoImpl implements FruitDao {
public void create() {
System.out.println("Dao层方法create被调用");
}
}
//服务层接口:
package com.spring.chapter4.service;
public interface FruitService {
public void create();
}
//服务层实现类:
package com.spring.chapter4.service.impl;
import com.spring.chapter4.dao.FruitDao;
import com.spring.chapter4.service.FruitService;
public class FruitServiceImpl implements FruitService {
private FruitDao fruitDao;
public FruitServiceImpl(FruitDao fruitDao) {
super();
this.fruitDao = fruitDao;
}
public void create() {
fruitDao.create();
}
}
这里和我们前面set注入的不同,提供的时我们熟悉的构造方法。
//配置文件(chapter4.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-2.5.xsd">
<bean id="fruitDao" class="com.spring.chapter4.dao.impl.FruitDaoImpl"/>
<bean id="fruitService" class="com.spring.chapter4.service.impl.FruitServiceImpl">
<constructor-arg type="com.spring.chapter4.dao.FruitDao" ref="fruitDao"/>
</bean>
</beans>
//测试类
package com.spring.chapter4.service.impl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.spring.chapter4.service.FruitService;
public class Test {
public static void main(String[] args) {
ApplicationContext act = new ClassPathXmlApplicationContext(
"chapter4.xml");
FruitService fruitService = (FruitService) act.getBean("fruitService");
fruitService.create();
}
}
三:构造参数索引:
可以解决参数同类型问题,并且配置时不用去维护参数顺序的问题,如果使用构造器注入(推荐使用这种方式),或者将前两者结合起来一起使用。
例如:给服务层添加两个属性
package com.spring.chapter4.service.impl;
import com.spring.chapter4.dao.FruitDao;
import com.spring.chapter4.service.FruitService;
public class FruitServiceImpl implements FruitService {
private FruitDao fruitDao;
private String name;
private String address;
public FruitServiceImpl(FruitDao fruitDao) {
super();
this.fruitDao = fruitDao;
}
public FruitServiceImpl(FruitDao fruitDao, String name, String address) {
super();
this.fruitDao = fruitDao;
this.name = name;
this.address = address;
}
public void create() {
fruitDao.create();
}
public FruitDao getFruitDao() {
return fruitDao;
}
public void setFruitDao(FruitDao fruitDao) {
this.fruitDao = fruitDao;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
//配置文件(chapter4.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-2.5.xsd">
<bean id="fruitDao" class="com.spring.chapter4.dao.impl.FruitDaoImpl"/>
<bean id="fruitService" class="com.spring.chapter4.service.impl.FruitServiceImpl">
<constructor-arg index="0" ref="fruitDao" />
<constructor-arg index="1" value="桔子" />
<constructor-arg index="2" value="中国" />
</bean>
</beans>
//测试类:
package com.spring.chapter4.service.impl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.spring.chapter4.service.FruitService;
public class Test {
public static void main(String[] args) {
ApplicationContext act = new ClassPathXmlApplicationContext("chapter4.xml");
FruitService fruitService = (FruitService) act.getBean("fruitService");
fruitService.create();
System.out.println(((FruitServiceImpl)fruitService).getName());
System.out.println(((FruitServiceImpl)fruitService).getAddress());
}
}
四:集合注入
Set集合、list集合、properties集合、map集合
package com.spring.chapter4.service.impl;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
public class CollectionService {
private Set<String> sets = new HashSet<String>();
private List<String> lists = new ArrayList<String>();
private Properties properties = new Properties();
private Map<String,String> maps = new HashMap<String, String>();
public Set<String> getSets() {
return sets;
}
public void setSets(Set<String> sets) {
this.sets = sets;
}
public List<String> getLists() {
return lists;
}
public void setLists(List<String> lists) {
this.lists = lists;
}
public Properties getProperties() {
return properties;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
public Map<String, String> getMaps() {
return maps;
}
public void setMaps(Map<String, String> maps) {
this.maps = maps;
}
}
//配置文件(collection.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-2.5.xsd">
<bean id="collectionService" class="com.spring.chapter4.service.impl.CollectionService">
<property name="sets">
<set>
<value>set1</value>
<value>set2</value>
<value>set3</value>
</set>
</property>
<property name="lists">
<list>
<value>list1</value>
<value>list2</value>
<value>list3</value>
</list>
</property>
<property name="properties">
<props>
<prop key="key1">properties1</prop>
<prop key="key2">properties2</prop>
<prop key="key3">properties3</prop>
</props>
</property>
<property name="maps">
<map>
<entry key="key1" value="maps1"/>
<entry key="key2" value="maps2"/>
<entry key="key3" value="maps3"/>
</map>
</property>
</bean>
</beans>
//测试类:
package com.spring.chapter4.service.impl;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestDemo {
public static void main(String[] args) {
ApplicationContext act = new ClassPathXmlApplicationContext("collection.xml");
CollectionService collectionService = (CollectionService) act.getBean("collectionService");
Set<String> set = collectionService.getSets();
for(String s:set){
System.out.println(s);
}
List<String> lists = collectionService.getLists();
for (String s : lists) {
System.out.println(s);
}
Properties properties = collectionService.getProperties();
for (Object key : properties.keySet()) {
System.out.println(key + ":" + properties.getProperty((String) key));
}
Map<String, String> mpas = collectionService.getMaps();
for(String key : mpas.keySet()){
System.out.println(key + ":" + mpas.get((String) key));
}
}
}
五:自动装配
(1). byName
<?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-2.5.xsd">
<bean id="fruitDao" class="dao.impl.FruitDaoImpl" />
<bean id="fruitService" class="service.impl.FruitServiceImpl"
autowire="byName" />
</beans>
需要注意的地方: <bean id="fruitDao" class="dao.impl.FruitDaoImpl" />
id="fruitDao"一定要和服务层的属性名称对应,即FruitDaoImpl类里面一定要有一个名称为fruitDao的属性.
(2). byType
<?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-2.5.xsd">
<bean id="fruitDao" class="dao.impl.FruitDaoImpl" />
<bean id="fruitService" class="service.impl.FruitServiceImpl"
autowire="byType" />
</beans>
需要保证FruitServiceImpl类中有一个属性类型是FruitDao类型即可.
尽量不要用自动装配的特性,因为会产生二异性,特别是按类型装配
相关推荐
- **依赖注入(DI)**:是Spring实现控制反转的主要手段,主要分为两种方式——构造器注入和setter注入。 - **构造器注入**:通过构造函数来注入依赖,这种方式更符合面向对象的设计原则。 - **setter注入**:通过...
第4章通知bean 4.1aop简介 4.1.1定义aop术语 4.1.2spring对aop的支持 4.2创建典型的spring切面 4.2.1创建通知 4.2.2定义切点和通知者 4.2.3使用proxyfactorybean 4.3自动代理 4.3.1为spring切面创建自动...
setter注入通过set方法来注入依赖,而构造器注入则在创建对象时就注入依赖。此外,我们还需要了解bean的id和name属性,它们用于唯一标识bean。简单属性注入允许我们为bean的属性赋值,而bean的作用范围(scope)定义...
第四章 对象、对象工厂和应用程序上下文 4.1.简介 4.2.IObjectFactory,IApplicationContext和IObjectDefinition接口介绍 4.2.1.The IObjectFactory和IApplicationContext 4.2.2.对象定义 4.2.3.对象的创建 ...
第4章 通知Bean 4.1 AOP简介 4.1.1 定义AOP术语 4.1.2 Spring对AOP的支持 4.2 创建典型的Spring切面 4.2.1 创建通知 4.2.2 定义切点和通知者 4.2.3 使用ProxyFactoryBean 4.3 自动代理 4.3.1 为Spring切...
第4章 通知Bean 4.1 AOP简介 4.1.1 定义AOP术语 4.1.2 Spring对AOP的支持 4.2 创建典型的Spring切面 4.2.1 创建通知 4.2.2 定义切点和通知者 4.2.3 使用ProxyFactoryBean 4.3 自动代理 4.3.1 为Spring切...
- **构造器注入**: 通过构造器参数传递依赖关系。 - **Setter方法注入**: 通过setter方法设置依赖关系。 - **字段注入**: 直接在类的字段上使用@Autowired注解进行注入。 **3. 集合的注入** - **概念**: 当一个类...
Bean自动装配是指Spring容器根据特定规则自动将Bean实例注入到依赖它们的其他Bean中的过程。这种方式可以简化配置。 **3.13 解释不同的自动装配模式** Spring框架支持以下几种自动装配模式: - **no**:默认模式...
- 构造器注入:通过配置`<constructor-arg/>`元素来注入。 - 接口注入:Spring当前版本不支持此方式。 6. 注入的数据类型包括: - JavaBean类型:通过`<ref/>`元素注入。 - 基本数据类型、包装类型和字符串:...
3. **注入类型**:包括setter注入和构造器注入,前者通过set方法设置依赖,后者在对象实例化时传入依赖。 4. **id、name**:在XML配置中,id是Bean的唯一标识,name则可以有多个,用于引用和查找Bean。 5. **简单...
* 构造器注入 * 属性注入 p 名称空间的支持 * 引入 p 名称空间 * 使用 p 名称空间注入属性 SpEL:Spring Expression Language * 统一使用 value 注入属性 注入数组或集合 * 注入数组或集合 团队开发(多个 ...
7. **设值注入(Setter Injection)**:设值注入的优点在于对于习惯传统JavaBean开发的程序员来说更直观,当依赖关系复杂时,构造注入的构造函数可能过于庞大,设值注入更简洁,且某些第三方库可能需要默认构造函数,...
- **构造器注入**:在构造函数中通过参数来设置依赖,有利于依赖关系的不可变性和对象的稳定性。 - **Setter方法注入**:通过setter方法来设置依赖,适用于可选依赖或在运行时可能变化的依赖。 ### Spring事件处理 ...
Spring支持多种方式注入Bean的依赖,如构造器注入、设值注入等。设值注入通过`<property>`标签实现,如下所示: ```xml ``` `name`属性对应Java类中的属性名,`value`属性提供该属性的值。 3. **工厂方法...
4. 构造器注入与setter注入的对比和选择。 5. 自动装配:@Autowired注解的使用及基于类型的自动装配。 6. Bean工厂与ApplicationContext的区别:理解这两种不同类型的IoC容器。 其次,AOP部分的Spring3PPT(AOP部分)...
3. **3.3 更多DI的知识**:涵盖了更多关于DI的高级话题,如构造器注入、属性注入、集合注入等,并解释了它们的适用场景。 4. **3.4 Bean的作用域**:阐述了Spring中Bean的不同作用域(如Singleton、Prototype、...