spring-ioc 核心之springbean的装配

spring-ioc装配

文章分文手动配置依赖(setter方法注入和构造函数注入)和byType及byName查找依赖

首先第一个手动配置依赖利用ClassPathXmlApplicationContext这个对象,非常普通的bean标签 setter方法注入和构造函数注入

	<bean id="dao1" class="org.springframework.test.main.dao.impl.UserDaoImpl1"></bean>
	<bean id="dao2" class="org.springframework.test.main.dao.impl.UserDaoImpl2"></bean>
	<bean id="service" class="org.springframework.test.main.service.impl.UserServiceImpl">
		<!-- service 依赖于 dao1-->
		<!-- setter 方法注入 name 属性为 setter方法名首字母小写 ref 属性为 注入到UserServiceImpl的<bean id='dao1'-->
		<!--<property name="dao11" ref="dao1"></property>-->
		<!-- 构造方法注入 name 为构造方法中注入的类型名称 ref 为注入属性类型的名称-->
		<constructor-arg name = "dao111" ref="dao1"></constructor-arg>
	</bean>
public class UserServiceImpl implements UserService {

	//setter 方法注入
//	UserDao dao1;
//	public void setDao11(UserDao dao1) {
//		this.dao1 = dao1;
//	}
	//构造 方法注入
	UserDao dao1;//注入属性类型名称
	public UserServiceImpl(UserDao dao111){//构造方法中注入属性的类型名称
		this.dao1 = dao111;
	}
	@Override
	public void query() {
		dao1.query();
		System.out.println("service");
	}
}

 

test测试

public class TestUserIoc {
	public static void main(String[] args) {
//ClassPathXmlApplicationContext cac = new ClassPathXmlApplicationContext("spring.xml");
//UserServiceImpl service = (UserServiceImpl) cac.getBean("service");
		AnnotationConfigApplicationContext cac = new AnnotationConfigApplicationContext(spring.class);
		UserServiceImpl service = (UserServiceImpl) cac.getBean("service");
		service.query();
	}
}

再来看byType 和 byName的装配方式

1.byName 已经注释掉依赖。byName的装配方式默认为为setter方法首字母小写,就是未设置name属性直接匹配id

<bean id="dao1" class="org.springframework.test.main.dao.impl.UserDaoImpl1"></bean>
	<bean id="dao2" class="org.springframework.test.main.dao.impl.UserDaoImpl2"></bean>
	<bean id="service" class="org.springframework.test.main.service.impl.UserServiceImpl" autowire="byName">
		<!-- service 依赖于 dao1-->
		<!-- setter 方法注入 name 属性为 setter方法名首字母小写 ref 属性为 注入到UserServiceImpl的<bean id='dao1'-->
		<!--<property name="dao" ref="dao1"></property>-->
		<!-- 构造方法注入 -->
		<!--<constructor-arg name="dao111"  ref="dao1"></constructor-arg>-->
	</bean>
public class UserServiceImpl implements UserService {

	//setter 方法注入
//	UserDao dao1;
//	public void setDao(UserDao dao1) {
//		this.dao1 = dao1;
//	}

	//构造 方法注入
//	UserDao dao1;
//	public UserServiceImpl(UserDao dao111){
//		this.dao1 = dao111;
//	}

	//byName 自动装配
	UserDao dao1;
	public void setDao1(UserDao dao1) {//setDao1首字母小写 可以改位setDao123 需和xml文件中bean id匹配,与此处的UserDao dao1 属性名无关,可以自己更改验证
		this.dao1 = dao1;
	}

	@Override
	public void query() {
		System.out.println("service");
		dao1.query();
	}
}

2.byType同样去掉依赖自动装配。byType是根据class的类型去装配的

	<bean id="dao1" class="org.springframework.test.main.dao.impl.UserDaoImpl1"></bean>
	<bean id="dao2" class="org.springframework.test.main.dao.impl.UserDaoImpl2"></bean>
	<bean id="service" class="org.springframework.test.main.service.impl.UserServiceImpl" autowire="byType">
		<!-- service 依赖于 dao1-->
		<!-- setter 方法注入 name 属性为 setter方法名首字母小写 ref 属性为 注入到UserServiceImpl的<bean id='dao1'-->
		<!--<property name="dao" ref="dao1"></property>-->
		<!-- 构造方法注入 -->
		<!--<constructor-arg name="dao111"  ref="dao1"></constructor-arg>-->
	</bean>
public class UserServiceImpl implements UserService {

	//setter 方法注入
//	UserDao dao1;
//	public void setDao(UserDao dao1) {
//		this.dao1 = dao1;
//	}

	//构造 方法注入
//	UserDao dao1;
//	public UserServiceImpl(UserDao dao111){
//		this.dao1 = dao111;
//	}

	//byName 自动装配
//	UserDao dao1;
//	public void setDao1(UserDao dao1) {
//		this.dao1 = dao1;
//	}

	//byType 自动装配
	UserDao  dao333;
	public void setDao444(UserDao dao333) {//根据class的类型去自动装配 可以发现这种装配方式与属性名无关与setter方法名无关
		this.dao333 = dao333;
	}

	@Override
	public void query() {
		System.out.println("service");
		dao333.query();
	}
}

我们可以测试一下是正常运行,但是如果将dao1和dao2类型这样改为同一个呢

	<bean id="dao1" class="org.springframework.test.main.dao.impl.UserDaoImpl1"></bean>
	<bean id="dao2" class="org.springframework.test.main.dao.impl.UserDaoImpl1"></bean>
	<bean id="service" class="org.springframework.test.main.service.impl.UserServiceImpl" autowire="byType">
		<!-- service 依赖于 dao1-->
		<!-- setter 方法注入 name 属性为 setter方法名首字母小写 ref 属性为 注入到UserServiceImpl的<bean id='dao1'-->
		<!--<property name="dao" ref="dao1"></property>-->
		<!-- 构造方法注入 -->
		<!--<constructor-arg name="dao111"  ref="dao1"></constructor-arg>-->
	</bean>

错误也很明显,我需要一个,但是匹配到了两个

 

除了改位byName以外,怎么样可以避免这类问题出现呢?下面结合了spring Annotation方式来验证

使用注解可以测试到@Autowired默认使用byType装配,@Resource默认使用byName(这儿的byName见下面解释)装配。到底是哪个注解次选byType装配后期验证

第一种组合注解使用指定一个具体的实现类

	//byType 自动装配
	@Autowired
	@Qualifier(value = "userDaoImpl1")
	UserDao dao;
	public void setDao(UserDao dao) {//根据class的类型去自动装配 可以发现这种装配方式与属性名无关与setter方法名无关
		this.dao = dao;
	}

第二种组合注解@Primary也指定一个具体的实现类

	//byType 自动装配
	@Autowired
	UserDao dao;
	public void setDao(UserDao dao) {//根据class的类型去自动装配 可以发现这种装配方式与属性名无关与setter方法名无关
		this.dao = dao;
	}

@Component
@Primary
public class UserDaoImpl2 implements UserDao {
	@Override
	public void query() {
		System.out.println("dao2");
	}
}

第三种使用@Resource注解,由上述代码运行后可以看到@Resource默认是使用byName,需要注意的是这个地方的byName的装配到的是属性名,与方法名无关。

	@Resource
	UserDao userDaoImpl1;
	public void setUserDaoImpl99999(UserDao dao) {//这儿默认是使用byName的装配方式,但这儿的byName匹配到的是属性名。与方法名无关
		this.userDaoImpl1 = dao;
	}

	@Override
	public void query() {
		System.out.println("service");
		userDaoImpl1.query();
	}

下面这种运行可以得到如果注解中有属性值,则以注解内的值为准,打印为dao2

	@Resource(name = "userDaoImpl2")
	UserDao userDaoImpl1;
	public void setUserDaoImpl99999(UserDao dao) {//这儿默认是使用byName的装配方式,但这儿的byName匹配到的是属性名。与方法名无关
	this.userDaoImpl1 = dao;
	}

	@Override
	public void query() {
		System.out.println("service");
		userDaoImpl1.query();
	}

接下来看看@Resource注解的type属性,我们如果按照下面的装配形式运行,肯定是会报错的。要么将@Resource(type = UserDaoImpl2.class)改为@Resource(type = UserDaoImpl1.class) 或者将UserDao userDaoImpl1改为UserDao userDaoImpl2一一对应即可成功。所以综上所述@Resource装配是类型默认以byName。但是这儿的byName又是以属性名装配的。

	@Resource(type = UserDaoImpl2.class)
	UserDao userDaoImpl1;
	public void setUserDaoImpl99999(UserDao dao) {//这儿默认是使用byName的装配方式,但这儿的byName匹配到的是属性名。与方法名无关
	this.userDaoImpl1 = dao;
	}

	@Override
	public void query() {
		System.out.println("service");
		userDaoImpl1.query();
	}

下篇请看代码解析ioc的装配

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 智慧社区背景与挑战 随着城市化的快速发展,社区面临健康、安全、邻里关系和服务质量等多方面的挑战。华为技术有限公司提出智慧社区解决方案,旨在通过先进的数字化技术应对这些问题,提升城市社区的生活质量。 2. 技术推动智慧社区发展 技术进步,特别是数字化、无线化、移动化和物联化,为城市社区的智慧化提供了可能。这些技术的应用不仅提高了社区的运行效率,也增强了居民的便利性和安全性。 3. 智慧社区的核心价值 智慧社区承载了智慧城市的核心价值,通过全面信息化处理,实现对城市各个方面的数字网络化管理、服务与决策功能,从而提升社会服务效率,整合社会服务资源。 4. 多层次、全方位的智慧社区服务 智慧社区通过构建和谐、温情、平安和健康四大社区模块,满足社区居民的多层次需求。这些服务模块包括社区医疗、安全监控、情感沟通和健康监测等。 5. 智慧社区技术框架 智慧社区技术框架强调统一平台的建设,设立数据中心,构建基础网络,并通过分层建设,实现平台能力及应用的可持续成长和扩展。 6. 感知统一平台与服务方案 感知统一平台是智慧社区的关键组成部分,通过统一的RFID身份识别和信息管理,实现社区服务的智能化和便捷化。同时,提供社区内外监控、紧急救助服务和便民服务等。 7. 健康社区的构建 健康社区模块专注于为居民提供健康管理服务,通过整合医疗资源和居民接入,实现远程医疗、慢性病管理和紧急救助等功能,推动医疗模式从治疗向预防转变。 8. 平安社区的安全保障 平安社区通过闭路电视监控、防盗报警和紧急求助等技术,保障社区居民的人身和财产安全,实现社区环境的实时监控和智能分析。 9. 温情社区的情感沟通 温情社区着重于建立社区居民间的情感联系,通过组织社区活动、一键呼叫服务和互帮互助平台,增强邻里间的交流和互助。 10. 和谐社区的资源整合 和谐社区作为社会资源的整合协调者,通过统一接入和身份识别,实现社区信息和服务的便捷获取,提升居民生活质量,促进社区和谐。
Spring-IOCSpring框架的核心部分之一,它是一种设计模式,全称为Inversion of Control(控制反转)。它通过将对象的创建、依赖关系的管理和对象的生命周期交给Spring容器来实现,从而降低了组件之间的耦合度,提高了代码的可重用性和可维护性。Spring-IOC的实现主要依靠Spring容器,Spring容器是Spring框架的核心,它负责创建、管理和装配Bean对象,其中Bean是Spring框架中最基本的组件。 Spring-IOC的实现主要有两种方式:BeanFactory和ApplicationContext。其中,BeanFactory是Spring-IOC的基本实现,而ApplicationContext是BeanFactory的子接口,提供了更多高级特性。ApplicationContext是Spring框架中最常用的IOC容器,它除了提供BeanFactory的所有功能外,还提供了更多的企业级特性,例如AOP、事务管理、国际化、事件传播等。 下面是一个简单的Spring-IOC的例子,假设我们有一个UserService接口和一个UserServiceImpl实现类,我们可以通过Spring-IOC容器来创建和管理UserServiceImpl对象: 1.定义UserService接口和UserServiceImpl实现类 ```java public interface UserService { void addUser(User user); } @Service public class UserServiceImpl implements UserService { @Override public void addUser(User user) { // 添加用户的具体实现 } } ``` 2.在Spring配置文件中配置UserService实例 ```xml <bean id="userService" class="com.example.service.UserServiceImpl"/> ``` 3.在代码中获取UserService实例并使用 ```java ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); UserService userService = context.getBean("userService", UserService.class); User user = new User(); userService.addUser(user); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值