【第4章】依赖注入和自动装配


前言

依赖注入有很多种不同的方式,接下来我们来逐一学习。


一、介绍

注入方式大体划分为两种:

  1. 手动注入
  2. 自动注入

二、手动注入

1.spring bean

Book

package org.example.di;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * Create by zjg on 2024/3/30
 */
public class Book {
    private String bName;
    private String author;
    private Version master;
    private String[]labels;
    private List<Version> versions;
    private List<Date> upgradeDate;
    private Map<String,Object> readerComments;
    private Set<Integer>pageSize;
    public Book() {
    }

    public Book(String bName, String author) {
        this.bName = bName;
        this.author = author;
    }

    public String getbName() {
        return bName;
    }

    public void setbName(String bName) {
        this.bName = bName;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public Version getMaster() {
        return master;
    }

    public void setMaster(Version master) {
        this.master = master;
    }

    public String[] getLabels() {
        return labels;
    }

    public void setLabels(String[] labels) {
        this.labels = labels;
    }

    public List<Version> getVersions() {
        return versions;
    }

    public void setVersions(List<Version> versions) {
        this.versions = versions;
    }

    public List<Date> getUpgradeDate() {
        return upgradeDate;
    }

    public void setUpgradeDate(List<String> upgradeDate) throws ParseException {
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
        List<Date> dateList=new ArrayList<>();
        for(String date:upgradeDate){
            dateList.add(sdf.parse(date));
        }
        this.upgradeDate=dateList;
    }

    public Map<String, Object> getReaderComments() {
        return readerComments;
    }

    public void setReaderComments(Map<String, Object> readerComments) {
        this.readerComments = readerComments;
    }

    public Set<Integer> getPageSize() {
        return pageSize;
    }

    public void setPageSize(Set<Integer> pageSize) {
        this.pageSize = pageSize;
    }

    @Override
    public String toString() {
        return "Book{" +
                "bName='" + bName + '\'' +
                ", author='" + author + '\'' +
                ", master=" + master +
                ", labels=" + Arrays.toString(labels) +
                ", versions=" + versions +
                ", upgradeDate=" + upgradeDate +
                ", readerComments=" + readerComments +
                ", pageSize=" + pageSize +
                '}';
    }
}

Version

package org.example.di;

/**
 * Create by zjg on 2024/3/30
 */
public class Version {
    private int version;

    public int getVersion() {
        return version;
    }

    public void setVersion(int version) {
        this.version = version;
    }

    @Override
    public String toString() {
        return "Version{" +
                "version=" + version +
                '}';
    }
}

2.多种类型

2.1 java 原生set

Book book=new Book();
book.setbName("java");
book.setAuthor("stilen");

2.2 spring set注入

<bean id="book" class="org.example.di.Book">
   <property name="bName" value="java编程思想"></property>
   <property name="author"><null></null></property>
</bean>
Book book = context.getBean("book", Book.class);

2.3 java 原生构造器

Book book=new Book("python","jimes");

2.4 spring构造器注入

 <bean id="book2" class="org.example.di.Book">
   <constructor-arg name="bName" value="&lt;&lt;活着&gt;&gt;"></constructor-arg>
    <constructor-arg name="author">
        <value><![CDATA["<余华>"]]></value>
    </constructor-arg>
    <!--外部bean引入-->
    <property name="master" ref="version"></property>
</bean>
Book book = context.getBean("book2", Book.class);

2.5 外部bean引入

<bean id="version" class="org.example.di.Version" scope="prototype">
  <property name="version" value="1"></property>
</bean>
<bean id="book" class="org.example.di.Book">
	<!--外部bean引入-->
   <property name="master" ref="version"></property>
</bean>

2.6 内部bean引入

<bean id="book" class="org.example.di.Book">
  <constructor-arg name="bName" value="&lt;&lt;活着&gt;&gt;"></constructor-arg>
   <constructor-arg name="author">
       <value><![CDATA["<余华>"]]></value>
   </constructor-arg>
   <property name="master">
       <bean id="version" class="org.example.di.Version">
           <property name="version" value="2"></property>
       </bean>
   </property>
</bean>

2.7 级联赋值

<bean id="book4" class="org.example.di.Book">
   <property name="master" ref="version"></property>
   <property name="master.version" value="3"></property>
</bean>

2.8 array

<bean id="book" class="org.example.di.Book">
   <property name="labels">
       <array>
           <value>斋藤飞鸟</value>
           <value>张予曦</value>
           <value>迪丽热巴</value>
       </array>
   </property>
</bean>

2.9 list

upgradeDate字段类型是日期,在set方法那里做了转换

<bean id="book" class="org.example.di.Book">
        <property name="versions">
            <list>
                <ref bean="version"></ref>
                <bean id="version2" class="org.example.di.Version">
                    <property name="version" value="2"></property>
                </bean>
            </list>
        </property>
        <property name="upgradeDate">
            <list>
                <value>2024-03-29</value>
                <value>2024-03-30</value>
                <value>2024-03-31</value>
            </list>
        </property>
    </bean>

2.10 map

map的value是Object,所以存放什么都行

<bean id="book" class="org.example.di.Book">
    <property name="readerComments">
        <map>
            <entry>
                <key>
                    <value>Sean Brdiy</value>
                </key>
                <value>This is good idea!</value>
            </entry>
            <entry>
                <key>
                    <value>version</value>
                </key>
                <ref bean="version"></ref>
            </entry>
        </map>
    </property>
</bean>

2.11 set

<bean id="book10" class="org.example.di.Book">
   <property name="pageSize">
        <set>
            <value>1</value>
            <value>2</value>
            <value>3</value>
        </set>
    </property>
</bean>

三、自动注入

1. spring bean

1.1 Controller

package org.example.auto.controller;

import org.example.auto.service.UserService;

public class UserController {
    UserService userService;

    public void setUserService(UserService userService) {
        this.userService = userService;
    }

    public void addUser(){
        System.out.println("执行...UserController");
        userService.addUserService();
    }
}

1.2 Service

package org.example.auto.service;

public interface UserService {
    public void addUserService();
}

1.3 ServiceImpl

package org.example.auto.service.impl;

import org.example.auto.dao.UserDao;
import org.example.auto.service.UserService;

public class UserServiceImpl implements UserService {
    UserDao userDao;

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

    @Override
    public void addUserService() {
        System.out.println("执行...UserServiceImpl");
        userDao.addUserDao();
    }
}

1.4 Dao

package org.example.auto.dao;

public interface UserDao {
    public void addUserDao();
}

1.5 DaoImpl

package org.example.auto.dao.impl;

import org.example.auto.dao.UserDao;

public class UserDaoImpl implements UserDao {
    @Override
    public void addUserDao() {
        System.out.println("执行...UserDaoImpl");
    }
}

1.6 config

<bean id="userDao" class="org.example.auto.dao.impl.UserDaoImpl"></bean>

2. byType

<bean id="userController" class="org.example.auto.controller.UserController" autowire="byType"></bean>

3. byName

<bean id="userService" class="org.example.auto.service.impl.UserServiceImpl" autowire="byName"></bean>

总结

回到顶部
这一章内容太多了,关于引入util、p命名空间和引入外部文件单独拆分出来了。

  • 53
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值