依赖注入方式(setter注入和constructor注入)

一、名词解释

1、控制反转/ IoC:在配置文件中创建对象

2、IoC容器:spring提供的一个容器,用来创建和管理对象

2、bean:在IoC容器中创建的对象的统称

        2.1:id:就是给这个bean起个名字

        2.2、class:创建一个什么类型的bean,(包名+类名)

        2.3、name:和id具有同样功能,但name可以写多个,中间用空格/逗号/分号隔开

        2.4、scope:bean的作用范围

                ①、singleton单例(确保一个类只有一个实例)

                ②、prototype非单例(一个类中可以有多个实例)

3、拓展

        3.1、静态工厂:指工厂的服务是静态的,即工厂提供的方法是static

                ①、factory-bean:工厂实例,

        3.2、实例工厂:工厂的服务不是静态的,即工厂提供的方法没有static

                ①、factory-bean:工厂实例

                ②、factory-method:工厂方法

3、依赖注入/DI:IoC容器中对象的关系的整个过程。即在IoC容器中对有依赖关系的bean进行绑定。

4、依赖注入方式:向一个类传入数据的方式

        4.1、setter注入(引用数据类型和简单数据类型)

        4.2、constructor注入(引用数据类型和简单数据类型)

二、setter注入(引用数据类型和简单数据类型)

1、新建一个maven项目

2、导入spring坐标并刷新maven——选择pom.xml

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>5.2.10.RELEASE</version>
</dependency>

3、在java包下新建dao包和service包,并分别在其包下新建接口和类

 4、在dao和service包下新建一个UserDao类和方法save()

 

 5、在resource包下新建spring config配置文件,命名为applicationContext.xml

------

如果发现没有这个resource包,直接新建就好 file——project structure——在Java/main上右键——new folder——新建后选中刚刚新建的包,再把上面的resource点击一下——ok

 --------------

6、在resource配置文件下,分别创建UserDao和UserService的bean 

7、这一步就是配置这两个bean的关系了,比如main调用UserServce,UserService调用UserDao

在UserService类中引用类型名private……并提供setter方法,具体步骤如下:

写好引用数据类型private UserDao userDao,然后右键——Generate——Setter——UserDao——ok

package service.Impl;

import dao.UserDao;
import service.UserService;
public class UserServiceImpl implements UserService {

    private UserDao userDao;
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void save() {
        System.out.println("setter注入————引用数据类型-----service层");
        userDao.save();
    }

}

 建立这两个bean的关系,既然是UserService对象调用UserDao,那就在UserService bean中配置UserDao属性property,name为引用类型名(private……),ref引用对象即UserDao bean的id

 --------

重点说一下这里property里的参数

        name:是类型名,和UserService里的引用类型名保持一致即private UserDao userDao保持一致

        ref:是IoC容器创建的dao层的UserDao的Bean的id值

--------

8、到这里Setter注入--引用类型就完成了,剩下的就是测试了

在test包的新建一个test类

import org.springframework.context.support.ClassPathXmlApplicationContext;
import service.UserService;

public class SetterTest {

    public static void main(String[] args) {
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

        UserService userService = (UserService)ctx.getBean("UserService");
        userService.save();
    }
}

9、运行结果:

 1、现在说一下,setter注入的简单数据类型,简单数据类型和引用数据类型差不多,只不过是

在配置property时将ref替换为value。

这次我们来为Dao层中UserDao类的一个方法使用简单数据类型,然后调用

 

package dao.Impl;

import dao.UserDao;

public class UserDaoImpl implements UserDao {
    public void save() {
        System.out.println("setter注入!————引用数据类型-----dao层");
    }


//    简单数据的setter注入方式
    private String username;
    private int age;

    public void setUsername(String username) {
        this.username = username;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void simpleType() {
        System.out.println( username + age );
    }

}

2、然后就去applicationContext.xml配置文件为UserDao类的两个简单数据类型配置值

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="UserDao" class="dao.Impl.UserDaoImpl" >
        <property name="username" value="张三" />
        <property name="age" value="12" />
    </bean>
    <bean id="UserService" class="service.Impl.UserServiceImpl">
        <property name="userDao" ref="UserDao" />

    </bean>
</beans>

3、在test包测试

import dao.UserDao;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import service.UserService;

public class SetterTest {

    public static void main(String[] args) {
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

//        简单数据类型的setter注入
        UserService userService = (UserService)ctx.getBean("UserService");
        userService.save();

//       简单数据类型的setter注入
        UserDao userDao = (UserDao)ctx.getBean("UserDao");
        userDao.simpleType();

    }
}
三、constructor注入(引用数据类型和简单数据类型)

1、其实构造器注入和setter注入从写代码角度是差不多,只不过在对待私有属性上,setter注入使用setter,构造器注入使用constructor;在bean配置上,setter使用property(name = " "  ref/value = " " )属性,而constructor注入使用constructor-org(name = “ ”  ref/value = “ ”)属性

2、具体步骤如下,分别在dao和service包下,新建一个BookDao和BookService类 在分别在其下新建constructor()方法

package dao.Impl;

import dao.BookDao;

public class BookDaoImpl implements BookDao {

//    构造器注入————引用数据类型
    public void constructor() {
        System.out.println("构造器注入————引用数据类型————dao层");
    }

}

package service.Impl;
import dao.UserDao;
import service.UserService;
public class UserServiceImpl implements UserService {

    private UserDao userDao;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void save() {
        System.out.println("setter注入————引用数据类型-----service层");
        userDao.save();
    }

}

3、新建一个配置文件,命名为constructorConfig.xml,为dao层和service层下的BookDao和BookService创建bean,并在BookService配置UserDao的属性

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    <bean id="BookDao" class="dao.Impl.BookDaoImpl"></bean>
    <bean id="BookService" class="service.Impl.BookServiceImpl">
        <constructor-arg name="bookDao" ref="BookDao" />
    </bean>
</beans>

4、到这里,constructor注入就完成了,接下来就是调用了

import org.springframework.context.support.ClassPathXmlApplicationContext;
import service.BookService;

public class constructorTest {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("constructorConfig.xml");
        BookService bookService = (BookService)ctx.getBean("BookService");
        bookService.constructor();
    }
}

-----------------------

接下来就是构造器注入的简单数据类型,在BookDao下测试

1、在dao包下的BookDaoImpl类

 

package dao.Impl;

import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;
import dao.BookDao;

public class BookDaoImpl implements BookDao {

//    构造器注入————引用数据类型
    public void constructor() {
        System.out.println("构造器注入————引用数据类型————dao层");
    }

//    构造器注入————简单数据类型
    private String username;
    private int age;

    public BookDaoImpl(String username, int age) {
        this.username = username;
        this.age = age;
    }

    public void simpleType() {
        System.out.println( username + age );
    }
}

2、进入constructorConfig.xml文件中对BookDao bean进行配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="BookDao" class="dao.Impl.BookDaoImpl">
        <constructor-arg name="username" value="李四" />
        <constructor-arg name="age" value="18" />
    </bean>
<bean id="BookService" class="service.Impl.BookServiceImpl">
    <constructor-arg name="bookDao" ref="BookDao" />
</bean>
</beans>

3、到这里构造器注入--简单数据类型就已经完成了, 

 

import dao.BookDao;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import service.BookService;

public class constructorTest {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("constructorConfig.xml");
        BookService bookService = (BookService)ctx.getBean("BookService");
        bookService.constructor();

        BookDao bookDao = (BookDao) ctx.getBean("BookDao");
        bookDao.simpleType();
    }
}

----------------------

关于依赖注入的两种方式已经完成了,其实差不多,但setter注入用的比较多!有什么疑问或质疑请留言,我们一起互相学习进步吧!

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值