SSM框架之Spring-IoC和DI的理解与三种常用注入方式

SSM 框架学习 (Spring篇)

一、IoC和DI

IoC(Inversion of Control)控制反转Spring两大核心之一,是一种不同于传统的设计思想。

那何来控制反转一说呢?我们先看传统的Java程序设计,当我们一个类内部需要一个对象资源时,通常是主动在内部new创建这个对象,是程序主动创建依赖对象的。

而IoC是有一个专门的容器来管理对象(资源)的创建的,当一个类需要其他对象时,是由IoC容器创建提供的,此时控制权实在IoC容器上的,所以控制反转了。

就好比你需要绞尽脑汁的寻找自己心仪的对象,变成了对象是由国家分配的,不用你主动寻找,你只需摆好姿势接收就行了。

那问题又来了!DI(Dependency Injection)依赖注入又是什么?似乎跟IoC很容易弄混!(没错,我开始就很混乱!)

其实IoC和DI是同一设计思想的不同角度的解读。这么说吧,IoC是设计目的,DI则是实现的手段,所以DI是Spring中实现IoC的主要机制或者说方式。

二、注入方式

注入方式有很多种,下面我会把我所学过的注入方式一一列举。

1.构造方式注入
这里只有一个类Greeting.java,测试类略~

public class Greeting {

	private String name = "Nobody";
	
	private String words = "Nothing";
	
	public Greeting() {} // 建议添加无参构造
	
	/**
	 * 注入name和words
	 * @param name
	 * @param words
	 */
	public Greeting(String name, String words) {
		this.name=name;
		this.words=words;
	}
	
	public void sayGreeting() {
		System.out.println(name + "说:”" + words + "”");
	}
}

主要配置

<!-- 注入当没有index属性时参数从上至下顺序匹配,所以此处index可以省略,type也可省略,对象注入写法相同。 -->
<bean id="mSay" class="com.lsl.ssm.service.Greeting">
	<constructor-arg index="0" type="String">
		<value>马云</value>
	</constructor-arg>
	<constructor-arg index="1">
		<value>我根本没有钱!</value>
	</constructor-arg>
</bean>

2.setter方式注入
Dialogue.java setter方式这里有更简单而且完整的参考[https://blog.csdn.net/liangshilin/article/details/80880133]

public class Dialogue {

	// 说话的人
	private String person = "Nobody";
	// 说话内容
	private String words = "Nothing";
	/**
	 *  获取说话的人
	 * @return
	 */
	public String getPerson() {
		return person;
	}
	/**
	 * 设置说话的人
	 * @param person
	 */
	public void setPerson(String person) {
		this.person = person;
	}
	
	/**
	 * 获取说话内容
	 * @return
	 */
	public String getWords() {
		return words;
	}
	
	/**
	 * 设置说话内容
	 * @param words
	 */
	public void setWords(String words) {
		this.words = words;
	}
	
	/**
	 * 定义说话的方法
	 */
	public void Say() {
		System.out.println(person + " 曰:\"" + words + "\"");
	}
}

主要配置

<!-- 此处name=“”要与类中的属性名完全对应 -->
<bean id="laoZiSay" class="com.lsl.ssm.service.Dialogue">
	<property name="person">
		<value>老子</value>
	</property>
	<property name="words">
		<value>中午不睡,下午崩溃!</value>
	</property>
</bean>

<bean id="kongZiSay" class="com.lsl.ssm.service.Dialogue">
	<property name="person">
		<value>孔子</value>
	</property>
	<property name="words">
		<value>老子说的对!</value>
	</property>
</bean>

3.注解方式注入
四种主要注解

@Component:可以用于注册所有bean
@Repository:主要用于注册dao层的bean
@Controller:主要用于注册控制层的bean
@Service:主要用于注册服务层的bean

实体类User.java

public class User {

	private int id;
	private String username;
	private String password;
	private String email;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}
	...
}

DAO层接口UserDao.java

public interface UserDao {

	public int save(User user);
}

UserDaoImp.java

@Repository("userDao") // 这个注解等同于在XML配置文件中编写<bean id="userDao" class="..UserDaoImp"/>
public class UserDaoImp implements UserDao {

	public int save(User user) {
		System.out.println("保存新用戶信息到数据库!");
		return 1;
	}

}

服务层接口UserService.java

public interface UserService {

	public void addNewUser(User user);
}

UserServiceImp.java

@Service("userService")
public class UserServiceImp implements UserService {

	// 方式一:
	// 声明接口类型的引用,和具体实现类解耦合
//	@Autowired //默认按类型匹配
//	@Qualifier("userDao") // 指定Bean名称匹配
//	private UserDao dao;

	//方式二:
//	private UserDao dao;
//	public UserServiceImp() {}
//	@Autowired
//	public void setDao((@Qualifier("userDao") UserDao dao) { // 可以对入参进行标注
//		this.dao = dao;
//	}	
	
	//方式三:使用Java标准注解完成装配
//	@Resource(name="userDao") //为dao属性名注入名为userDao的bean
	@Resource //查找名为dao的bean并注入给dao属性
	private UserDao dao;
	
	
	public void addNewUser(User user) {
		if(dao.save(user)==1) System.out.println("保存成功!");
	}

}

配置,使用注解,配置就很简单了,只有一条配置就够了

<!--  扫描包中注解标注的类  -->
<context:component-scan base-package="com.lsl.ssm.service,com.lsl.ssm.dao"/>

该有的解释已经在注释里了

更多推荐
MybatisHelperPro <<<<自己开发的一个Mybatis反编译插件,能快速生成代码,有兴趣可以看看

@Author 瞌睡虫
@mybatis-3.2.2
@Database: mysql 5.7.15
@Tool: MyEclipse

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值