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"/>

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

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

猜你喜欢

转载自blog.csdn.net/liangshilin/article/details/81429551