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的三种实现方式以及优劣的主要内容,如果未能解决你的问题,请参考以下文章
开源SIP服务器Kamailio/OpenSIPS的三种信令负载均衡算法优化详解以及测试讨论和基于SBC信令语音均衡负载功能实现