Day21SSM之SpringDI

本文详细介绍了Spring框架中的依赖注入(DI)概念,包括set方法注入、复杂类型如数组、集合的注入方式,以及注解方式的创建和注入。通过实例演示如何在XML配置文件和注解中实现对象的依赖关系管理,提升代码的解耦性和灵活性。
摘要由CSDN通过智能技术生成

Spring依赖注入DI-set方法

  1. 什么是依赖注入
    DI (dependency injection) 依赖注入
  • 就是给对象的属性设置值
  • set方法给对象设置值
  • 构造方法给对象初始化的时候设置值.
  1. property标签
  • set方式设置属性(掌握)
  • 让spring调set方法,前提条件类中必须有set方法
  • name : 代表的是set方法去掉set,首字母小写setName Name name
  • value: 基本类型或字符串类型的值,具体给属性设置用的
  • ref (引用) : 引用对象的id,作为一个对象类型注入
    在这里插入图片描述
    作为一个对象类型注入

Spring依赖注入-给复杂类型注入

  1. 什么是复杂类型?
    简单的是基本类型与字符串
    Aarry 数组 List 集合 Map集合 Set集合 Properties集合
  2. 如何给这些属性设置值
    使用对应的子标签
    array
    list
    map
    set
    props

src\main\java\com\vission\bean\Person3.java

public class Person3 {
    //集合类型属于复杂类型
    private String[] arr; //女朋友们
    //List
    private List<String> list;//前女朋友们
    //set
    private Set<String> set;//前女朋友们
    //map
    private Map<String, String> map;//前女朋友们
    //properties
    private Properties properties;//前女朋友们
    .
    .
    .

ApplicationContext.xml

 <bean id="person3" class="com.vission.bean.Person3">
<!--        <property name="name" value="jack"/>-->
        <property name="arr">
            <array>
                <value >rose</value>
                <value >rose</value>
                <value >rose</value>
            </array>
        </property>
        <property name="list">
            <list>
                <value >rose1</value>
                <value >rose2</value>
                <value >rose3</value>
            </list>
        </property>
        <property name="set">
            <set>
                <value >rose</value>
                <value >rose</value>
                <value >rose3</value>
            </set>
        </property>
        <property name="map">
            <map>
                <entry key="10010" value="rose1"/>
                <entry key="10086" value="rose2"/>
                <entry key="110" value="rose3"/>
            </map>
        </property>
        <property name="properties">
            <props>
                <prop key="10010">rose1</prop>
                <prop key="10086">rose2</prop>
                <prop key="110">rose3</prop>
            </props>
        </property>
    </bean>

TestSpringIOC

 @Test
    public void test03() {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        Person3 person3 = context.getBean("person3", Person3.class);
        System.out.println(person3);
    }

在这里插入图片描述

Spring依赖注入-Xml方式 Dao

首先先了解什么是依赖注入

什么是依赖?

在这里插入图片描述
这玩意就是依赖
连起来依赖注入就是对象注入

为什么要依赖注入?

为了解耦
吃饭:

  1. 做饭(构造方法)——>找食材(持有依赖)依赖严重,如果食材换了,做饭的方法也需要换
  2. 不需要如何做饭,也不需要找到食材,只需要找到饭店(工厂模式),明显降低耦合,但是你需要持有饭店的位置(持有工厂的依赖)

再比如手机:
如果你需要升级你手中的手机,你需要更换手机,你与上一部的手机耦合依旧存在,你的照片联系人,记录都存在上一部手机中。
但是如果你找一个管家emmmm这个算了我也只能想到这么非主流的办法解释了替你管理手机,至于换不换手机(升不升级功能),这些问题都不需要你去考虑。你只要考虑把这个管家随时带着,想玩手机了,刷微博?好的你告诉管家一声,这样类比,你与手机的耦合全部外包给了这个管家,只要你不换掉这个管家就行了,而这个管家对我们程序员来说就是Spring框架。
src\main\java\com\vission\Service\PersonService.java

public class PersonService {
    private PersonDao personDao ;
    public void setPersonDao(PersonDao personDao) {
        this.personDao = personDao;
    }
    public boolean login(Person4 p) {
        Person4 person4 = personDao.find(p);
        if (person4==null ){
            return false;
        }else{
            return true;
        }
    };
}

src\main\java\com\vission\Dao\PersonDao.java

public class PersonDao {
    public Person4 find(Person4 p) {
        if("jack".equals(p.getName())&&"12345".equals(p.getPassword())){
            return p;
        }else{
            return null;
        }
    }
}

ApplicationContext.xml

  <bean id="personDao" class="com.vission.Dao.PersonDao"></bean>
    <bean id="personService" class="com.vission.Service.PersonService">
        <property name="personDao" ref="personDao"></property>
    </bean>

TestSpringIOC

 @Test
    public void test05(){
       ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");
        PersonService personService = (PersonService) context.getBean("personService");
        Person4 p  = new Person4();
        p.setName("jack");
        p.setPassword("12345");
        boolean flag =personService.login(p);
        System.out.println(flag);
    }

运行结果
在这里插入图片描述

Spring依赖注入-注解创建对象***

  1. 对象比较多的话,开启注解扫描
<?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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
    <!--
        使用注解方式进行创建对象
        1.开启注解扫描
        含义:开启注解扫描,指定了 base-package 扫描指定的包,扫描包与子包中所有的类
        查看类上是否有指定的注解, 如果类上有指定的注解,那么就创建给类对象,
        放到spring容器中
    -->
    <context:component-scan base-package="com.vission"/>
    </beans>
  1. 只有标记有注解的类,才会被创建对象且添加到ioc容器中
  2. 四个注解
//@Component  //其他层
//@Repository //Dao层
//@Service    //Service层
@Controller("xxx")//Controller层
public class MyClass{
}
@Component
@Repository
@Service
@Controller

<context:component-scan base-package=""/>中指定多个包:
例如

<context:component-scan 
			base-package="cn.edu.dao.impl,cn.edu.service.impl,cn.edu.action"/>

多个包逗号隔开。

  • 注解没有配置id,但是默认是 myClass
    @Test
    public void test10(){

        PersonService personService = (PersonService) context.getBean("personService");
        log.debug(personService+" test10");

        PersonDao personDao = (PersonDao) context.getBean("personDao");//id为类名首字符小写
        log.debug(personDao +" test10");
    }

Spring依赖注入-注解实现注入***

  1. 注入是什么?
    就是查找之后,进行赋值
  2. 三种注入方式
  • @Autowired或者@Autowired @Qualifier(“bean的id”)
  • @Value("#{bean的id}")
  • @Resource(name=“bean的id值”)
@Service
public class PersonService {
   //private PersonDao personDao = new PersonDao();
    //第一种:@Autowired或者  @Autowired和@Qualifier("bean的id")搭配
    //第二种:@Value("#{bean的id}")
    //第三种:@Resource(name="bean的id值")
    @Autowired
    PersonDao personDao ;
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值