欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring入门 IOC理论,第一个spring程序Di依赖注入,Bean的自动装配

程序员文章站 2022-07-04 19:39:05
...

简介

spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。

Spring的组成

Spring入门 IOC理论,第一个spring程序Di依赖注入,Bean的自动装配
  • Spring Core 核心容器

    核心容器提供Spring框架的基本功能,Spring以bean的方式组织和管理java应用的各个组件和关系

    使用BeanFactory来产生和管理Bean

  • SpringContext 应用上下文 一个配置文件,向Spring框架提供上下文信息

  • Spring Aop 面向切面编程

  • Spring Dao 数据库连接模块

  • Spring ORM 对象实体映射

  • Spring Web web应用程序模块

  • Spring Web mvc mvc模块

IOC理论推导

传统开发

  1. UserDao接口
  2. UserDaoImpl实现类
  3. UserService 业务接口
  4. UserServiceImpl 业务实现类接口

但用户的需求可能会影响我们原来的代码,我们需要根据用户的需求去修改源代码,如果代码量非常大,修改的位置很多

IOC原型

可以用Set进行动态实现值的注入

private UserDao userDao;

public void setUserDao(UserDao userDao){
    this.userDao=userDao;
}
//在业务层调用的时候修改传进的对象,来获取对应的实现类
//动态实现值的注入,用户选择业务的对象
//设计者不用去管理对象的创建,降低了系统的耦合性

IOC本质

将对象的创建转移给第三方,获得依赖对象的方式反转了

Spring创造IOC的方式

  1. 默认使用无参构造器创建对象

    若使用有参构造器创建对象

    可使用构造器参数实现

  2. 使用Set方法注入参数

构造器参数实现

<constructor-arg type="java.lang.String" value="32"/>
<constructor-arg index="0" value="33"/>	<!--下标默认从0开始-->
<constructor-arg name="name" value="34"/>   直接通过参数名设置

配置环境

导入依赖

<dependencies>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.2.8.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>5.2.8.RELEASE</version>
    </dependency>
</dependencies>

HelloSpring

实体类

public class Hello {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Hello{" +
                "name='" + name + '\'' +
                '}';
    }
}

bean配置文件

  • id:bean的唯一标识符
  • class:bean对象所对应的类型
  • name:bean的别名
<bean id="hello2" class="Hello">
    <!--放置这个bean的协作者和配置-->
    <!-- 
		Hello hello = new Hello();
		id = 变量名
		class = new 的对象
		<property name="name" value="Spring"/>		相当于给对象属性设值
	-->
    <property name="name" value="Spring"/>
</bean>

测试类

@Test
public void test1(){
    //获取Spring上下文对象
    ApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("application.xml");
    //获取bean
    Hello hello2 = (Hello) classPathXmlApplicationContext.getBean("hello2");
    System.out.println(hello2.getName());
}

Hello对象是由Spring创建的,由Spring容器设置属性

本质上用Set方法注入

ApplicationContext产生流程

Spring入门 IOC理论,第一个spring程序Di依赖注入,Bean的自动装配

DI依赖注入

依赖:bean对象的创建依赖于容器

注入:bean对象的属性依赖于容器注入

Set方法注入

复杂类型注入

private String name;
private Address address;
private  String[] books;
private List<String> hobbies;
private Map<String,String> card;
private Set<String> games;
private String wife;
private Properties info;
<bean id="address" class="com.lyc.pojo.Address">
    <property name="address" value="Guangdong"/>
</bean>

<bean id="student" class="com.lyc.pojo.Student">
    <!--普通值注入-->
    <property name="name" value="lyc"/>
    <!--对象类型注入-->
    <property name="address" ref="address"/>
    <!--数组类型注入-->
    <property name="books">
        <array>
            <value>西厢记</value>
            <value>金瓶梅</value>
        </array>
    </property>
    <!--List类型注入-->
    <property name="hobbies">
        <list>
            <value>听歌</value>
            <value>看电影</value>
        </list>
    </property>
    <!--Map类型注入-->
    <property name="card">
        <map>
            <entry key="银行卡" value="3306"/>
            <entry key="校园卡" value="3308"/>
        </map>
    </property>
    <!--set类型注入-->
    <property name="games">
        <set>
            <value>123</value>
            <value>456</value>
        </set>
    </property>
    <!--property注入-->
    <property name="info">
        <props>
            <prop key="学号">23232</prop>
        </props>
    </property>
    <!--空指针注入-->
    <property name="wife">
        <null/>
    </property>
</bean>

Bean的作用域

Spring入门 IOC理论,第一个spring程序Di依赖注入,Bean的自动装配

singleton 单例模式,默认

Spring入门 IOC理论,第一个spring程序Di依赖注入,Bean的自动装配
<bean id="accountService" class="com.foo.DefaultAccountService" scope="singleton"/>

原型模式,每一次使用都创建一个对象

Spring入门 IOC理论,第一个spring程序Di依赖注入,Bean的自动装配
<bean id="accountService" class="com.foo.DefaultAccountService" scope="prototype"/>

Bean自动装配

Byname自动装配

spring容器会自动寻找set方法对应的beanid,会自动在容器上下文中查找,和自己对象set方法后面的值对应的beanid,要保证id唯一

<bean id="cat" class="com.lyc.pojo.Cat"/>
<bean id="dog" class="com.lyc.pojo.Dog"/>

<bean id="people" class="com.lyc.pojo.People" autowire="byName">
    <property name="name" value="lyc"/>
</bean>

Bytype

spring容器会自动寻找类型对应的beanid,会自动在容器上下文中查找,要保证类型唯一

<bean id="cat" class="com.lyc.pojo.Cat"/>
<bean id="dog" class="com.lyc.pojo.Dog"/>

<bean id="people" class="com.lyc.pojo.People" autowire="byType">
    <property name="name" value="lyc"/>
</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"
        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">

        <context:annotation-config/>

</beans>

@autowired

可以在set方法,也可以在属性上使用,默认为byType,byType找不到在Byname

@Autowired		//实现属性的自动装配
private Cat cat;
@Autowired
@Qualifier(value="dog222")    //指定名字
private Dog dog;

@Nullable 这个字段可以为null

@Autowired(required = false)这个对象可以为null

ext.xsd">

    <context:annotation-config/>
```

@autowired

可以在set方法,也可以在属性上使用,默认为byType,byType找不到在Byname

@Autowired		//实现属性的自动装配
private Cat cat;
@Autowired
@Qualifier(value="dog222")    //指定名字
private Dog dog;

@Nullable 这个字段可以为null

@Autowired(required = false)这个对象可以为null