Spring-DI的三种实现方式以及优劣

Posted 「已注销」

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring-DI的三种实现方式以及优劣相关的知识,希望对你有一定的参考价值。


文章目录

Spring-DI的三种实现方式以及优劣

从现在起,master分支切换为Java EE,80%的时间都花在Java EE上面。其余时间再慢慢分配。我已经不再是android的人了。做了10个月Android,除了NDK比较弱,别的方面都还好。过完年回来再花点时间研究NDK。谈起Spring,能表达的只能是6666。在Java EE领域的能力真的是一家独大。通常情况下,获取一个对象的实例是调用者创建被调用者的实例。而使用Spring框架,调用者并不负责创建被调用者的实例。这部分工作由Spring框架来完成,并且在对象需要使用的地方,由Spring自动注入。这就是Spring的依赖注入和控制反转功能。而具体是如何使用的呢?有哪些使用方式?这些使用方式有哪些优劣之处。这篇文章就是记录此功能的。我也是学习者,不是老司机。不对的地方多多指证。

设值注入

设值注入的方式很简单,通过定义setter方法,Spring调用无参构造方法,然后调用你所定义的setter函数。将值设置给程序所需要的地方。直接上代码。

定义model:

package com.model;

public class User 

	public String username;
	public String password;
	public String getUsername() 
		return username;
	
	public void setUsername(String username) 
		this.username = username;
	
	public String getPassword() 
		return password;
	
	public void setPassword(String password) 
		this.password = password;
	

定义dao层接口:

package com.dao;

import com.model.User;

public interface UserDao 

	public void save(User user);

实现dao,只是一个简单的测试。:

package com.dao;

import com.model.User;

public class UserDaoImpl implements UserDao 

	@Override
	public void save(User user) 
		System.out.println(user.getUsername()+"   "+user.getPassword()+" write to mysql");	
	

定义service:

package com.service;

import com.model.User;

public interface UserService 
	public void addUser(User user);

定义service实现:

package com.service;

import com.dao.UserDao;
import com.model.User;

public class UserServiceImpl implements UserService
	
	private UserDao userDao;

	@Override
	public void addUser(User user) 
		userDao.save(user);
	
	
	public UserDao getUserDao() 
		return userDao;
	
	
	public void setUserDao(UserDao userDao) 
		this.userDao = userDao;
	

定义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:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
      <bean id="u" class="com.dao.UserDaoImpl"/>
       <bean id="userService" class="com.service.UserServiceImpl">
       		<property name="userDao">
       			<ref bean="u"/>
       		</property>
       </bean>
</beans>

测试:

package com.model;

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

import com.service.UserServiceImpl;

public class Main 

	public static void main(String[] args) 
//		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//		Person person = (Person) context.getBean("chinese");
//		person.speak();
//		person = (Person) context.getBean("american");
//		person.speak();
		
		ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
		UserServiceImpl serviceImpl = (UserServiceImpl) context.getBean("userService");
		User user = new User();
		user.setUsername("Kevin");
		user.setPassword("123456");
		serviceImpl.addUser(user);
	

结果图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JvLZrw4u-1607859624561)(http://7xk0q3.com1.z0.glb.clouddn.com/Screen%20Shot%202017-01-13%20at%2011.22.34%20AM.png)]

构造方法注入

只需要在UserServiceImpl的实现上加上如下构造方法:

// 构造方法注入 
	public UserServiceImpl(UserDao userDao) 
		this.userDao = userDao;
	

配置bean.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:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
      <bean id="u" class="com.dao.UserDaoImpl"/>
       <bean id="userService" class="com.service.UserServiceImpl">
       		<!-- <property name="userDao">
       			<ref bean="u"/>
       		</property> -->
       		<constructor-arg>
       			<ref bean="u"/>
       		</constructor-arg>
       </bean>
</beans>

运行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yLRcuKi9-1607859624565)(http://7xk0q3.com1.z0.glb.clouddn.com/Screen%20Shot%202017-01-13%20at%2011.22.34%20AM.png)]

接口注入

接口注入需要实现特定接口,这种方式是侵入性的。 Spring不支持侵入式的操作。EJB和Avalon就是使用这种方式。

三种实现方式的比较

因为接口注入的方式在Spring中已经被遗弃了。所以暂时我们只比较构造方法注入和设值注入:

构造方法注入

优点

  • 符合Java设计原则
  • 减少繁琐的设值。
  • 系统层次清晰度明显

缺点

  • 错误比较难找
  • 需要手动继承
  • 很难处理一些特殊关系

设值注入

优点

  • 对于关系比较复杂或者成员变量比较多的情况。这种情况比较适合。

缺点

容易破坏类的状态和行为。

以上是关于Spring-DI的三种实现方式以及优劣的主要内容,如果未能解决你的问题,请参考以下文章

Java 数组转 List 的三种方式及对比

前端学习----实现跑马灯的三种方式

NBIoT三种部署方式

winform、wpf蓝牙扫描的三种方式

开源SIP服务器Kamailio/OpenSIPS的三种信令负载均衡算法优化详解以及测试讨论和基于SBC信令语音均衡负载功能实现

SQL Server中Upsert的三种方式