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 + "”");
}
}
主要配置
<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 + "\"");
}
}
主要配置
<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配置文件中编写
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"/>
该有的解释已经在注释里了
@Author 瞌睡虫
@mybatis-3.2.2
@Database: mysql 5.7.15
@Tool: MyEclipse