Springday01 maven依赖Spring介绍IOC模块IOC控制反转DI依赖注入SpEL表达式

Posted halulu.me

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Springday01 maven依赖Spring介绍IOC模块IOC控制反转DI依赖注入SpEL表达式相关的知识,希望对你有一定的参考价值。

maven依赖

在这里插入图片描述

Spring介绍

Spring是分层的Java SE/EE应用的full-stack轻量级开源框架。
它是以IOC(Inversion Of Control)控制反转和AOP(Aspect Oriented Programming)面向切面编程为核心

Spring在三层架构中的地位

在这里插入图片描述
优势

解耦,轻量级,可插拔

IOC模块

解耦概念

耦合(Coupling):代码书写过程中所使用技术的结合紧密度,用于衡量软件中各个模块之间的联系程度

在这里插入图片描述

内聚(Cohesion):代码书写过程中单个模块内部各组成部分间的联系,用于衡量软件中各个功能模块内部的功能联系

在这里插入图片描述

程序的书写目标:高内聚、低耦合
就是同一个模块内的各个元素之间要高度紧密,但是各个模块之间的相互依赖度不要那么紧。

工厂模式解耦发展史

1、在这里插入图片描述

2、
在这里插入图片描述

3、
在这里插入图片描述

解耦的好处

  1. 解耦: 减少依赖关系。通常都是降低依赖关系,不一定做到0耦合,只需要达到松耦合。
  2. 好处: 更便于维护扩展。

IOC模块

IOC模块包含 IOC 控制反转和 ID 依赖注入

1、控制反转

Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。原本由开发者自己管理对象的权利,现在将这个控制权利交给IOC容器进行创建对象,封装数据,和管理对象之间的依赖,这就是控制反转。本质就是把对象的管理工作交给工厂来完成。

在这里插入图片描述

2、依赖注入

DI—Dependency Injection,即“依赖注入”
依赖注入,就是把对象的成员属性赋值工作交给工厂BeanFactory)来完成!

IOC控制反转

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

    <!--IOC创建对象第一步:配置文件配置创建的类
        <bean> 用于创建对象配置
        属性 id="别名" 给对象起的别名,因为IOC创建对象后会将对象放入IOC容器,代码中可以根据这个别名从IOC容器中获取对应对象
        属性 class="类全名", 配置IOC工厂创建类对象的全名
    -->
    <bean id="user" class="com.itheima.entity.User"></bean>
</beans>
public class App01_bean {

    //目标:测试IOC容器创建对象,并且从IOC容器中获取对应的对象
    @Test
    public void test(){

        //1.创建IOC容器:IOC容器就会解析配置文件beans1_bean.xml里面的数据进行创建对象并加入IOC容器
        //容器接口:ApplicationContext
        //接口实现类:ClassPathXmlApplicationContext
        ApplicationContext ac = new ClassPathXmlApplicationContext("beans1_bean.xml");

        //2.根据对象的id属性别名从IOC容器里面获取对象
        User user = (User) ac.getBean("user");

        //3.打印输出对象
        System.out.println(user);

    }
}

配置标签

在这里插入图片描述
bean的生命周期

在这里插入图片描述

创建IOC容器的时候就会创建一个单例对象,但并会不创建多例对象。
多例对象是在IOC容器getBean()的时候创建,获取一次创建一次。

获取IOC容器的四种方式:

1、ClasspathXmlApplicationContext 使用类路径加载配置文件
2、FileSystemXmlApplicationContext 使用绝对路径加载配置文件
3、AnnotationConfigApplicationContext 加载注解配置类的
4、父类接口BeanFactory 创建容器

	//ClasspathXmlApplicationContext  使用类路径加载配置文件
	@Test
    public void test(){

        ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:beans.xml");

        Student student = (Student) ac.getBean("student");

        System.out.println(student);
    }

	//FileSystemXmlApplicationContext  使用绝对路径加载配置文件
    @Test
    public void test2(){

        ApplicationContext ac = new FileSystemXmlApplicationContext("F:\\\\projects\\\\javaee\\\\springday01\\\\src\\\\main\\\\resources\\\\beans.xml");

        Student student = ac.getBean("student",Student.class);

        System.out.println(student);
    }

	//父类接口BeanFactory 创建容器
    @Test
    public void test3(){

        Resource resource = new ClassPathResource("beans.xml");

        XmlBeanFactory factory = new XmlBeanFactory(resource);

        Student student = (Student) factory.getBean("student");

        System.out.println(student);

    }

创建对象的三种方式:

方式1:默认无参数构造函数创建对象(推荐)

方式2:工厂类的静态方法创建对象

方式3:工厂类的实例方法创建对象

public class UserFactory {

    //静态方法创建对象
    public static User createUserByStatic(){
        System.out.println("调用了静态方法创建对象");
        return  new User();
    }

    //实例方法创建对象
    public User createUser(){
        System.out.println("调用了实例方法创建对象");
        return new User();
    }
}
<?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">


    <!--
    掌握创建对象的三种方式:
        方式1:默认的,使用无参构造函数创建对象(最常用)
        方式2:调用工厂类的静态方法创建对象
        方式3:调用工厂类的实例方法创建对象
        结论: 创建自己的类默认都使用方式1, 整合其他框架会使用方式2或方式3(例如:mybatis)
    -->

    <!-- 方式1:默认的,使用无参构造函数创建对象(最常用) -->
    <bean id="user" class="com.itheima.entity.User"></bean>

    <!--方式2:调用工厂类的静态方法创建对象
        class="工厂类全名"
        factory-method=“创建对象的静态方法名字”
    -->
    <bean id="user2" class="com.itheima.factory.UserFactory" factory-method="createUserByStatic"></bean>


    <!--
    方式3:调用工厂类的实例方法创建对象
    实现步骤:
        1.创建UserFactory工厂对象
        2.使用UserFactory工厂对象调用实例方法创建User对象
          <bean id="对象别名" factory-bean="工厂对象" factory-method="实例方法名字"></bean>
    -->
    <!--创建UserFactory工厂对象-->
    <bean id="userFactory"  class="com.itheima.factory.UserFactory"></bean>
    <!--使用UserFactory工厂对象调用实例方法创建User对象-->
    <bean id="user3" factory-bean="userFactory" factory-method="createUser"></bean>


</beans>

DI依赖注入

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:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean class="com.halulu.entity.Student" id="student">
        <constructor-arg index="0" value="20"></constructor-arg>
        <constructor-arg index="1" value="张三"></constructor-arg>
    </bean>

    <bean class="com.halulu.entity.Student" id="student2">
        <constructor-arg name="age" value="19"></constructor-arg>
        <constructor-arg name="name" value="张三"></constructor-arg>
    </bean>

    <bean class="com.halulu.entity.Student" id="student4">
        <constructor-arg type="java.lang.Integer" value="20"></constructor-arg>
        <constructor-arg type="java.lang.String" value="张三"></constructor-arg>
    </bean>

    <bean class="com.halulu.entity.Student" id="student5">
        <constructor-arg type="java.lang.Integer" value="20"></constructor-arg>
        <constructor-arg type="java.lang.String" ref="str"></constructor-arg>
    </bean>
    <bean class="java.lang.String" id="str">
        <constructor-arg value="张三"></constructor-arg>
    </bean>

</beans>

2、set方法注入

name = "xxx "参数来自于setXxx。首字母小写。

    <bean class="com.halulu.entity.Student" id="student3">
        <property name="age5" value="20"></property>
        <property name="name" value="张三"></property>
    </bean>

3、p名称空间注入

<?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:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean class="com.halulu.entity.Student" id="student6" p:age5="20" p:name="张三"></bean>

注意:

需要导入: xmlns:p="http://www.springframework.org/schema/p"

4、复杂类型属性注入

<?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:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

 
    <!--
    给复杂类型属性赋值注入
    -->
    <bean id="person7" class="com.itheima.entity.Person">
        <property name="array">
            <array>
                <value>111</value>
                <value>222</value>
                <value>333</value>
            </array>
        </property>

        <property name="list">
            <list>
                <value>张三</value>
                <value>李四</value>
                <value>王五</value>
            </list>
        </property>

        <property name="map">
            <map>
                <entry key="one" value="广州"></entry>
                <entry key="two" value="深圳"></entry>
            </map>
        </property>

        <property name="set">
            <set>
                <value>java</value>
                <value>spring</value>
                <value>mybatis</value>
            </set>
        </property>

        <property name="props">
            <props>
                <prop key="hobby">爱编程</prop>
                <prop key="address">北京</prop>
            </props>
        </property>
    </bean>
</beans>

IOC获取对象三种方式

//1.根据beans.xml配置文件创建IOC容器(所有需要的核心业务对象都已成功创建)
        ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");

        //2.从IOC容器中获取Service业务对象
        //IOC中获取对象方式1:根据别名获取
        AccountService accountService = (AccountService) ac.getBean("accountService");

        //IOC中获取对象方式2:根据指定类型获取【推荐】
        //注意:根据类型获取必须保证IOC容器中这个类型的对象必须只有一个,否则会报错存在多个
        AccountService accountService =  ac.getBean(AccountService.class);

        //IOC中获取对象方式3:根据指定别名和类型获取
        AccountService accountService =  ac.getBean("accountService",AccountService.class);
    }
}

SpEL 表达式

Spring表达式语言(简称SpEL)是一个支持查询和操作运行时对象导航图功能的强大的表达式语言。它的语法类似于传统EL,但提供额外的功能,最出色的就是函数调用和简单字符串的模板函数。

<?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 class="com.halulu.entity.Student" id="student2">
        <constructor-arg index="0" value="#{student.getAge()}"></constructor-arg>
        <constructor-arg index="1" value="#{str}"></constructor-arg>
    </bean>

    <!--数值运算-->
    <bean class="com.halulu.entity.Student" id="student3">
        <property name="age" value="#{10+10}"></property>
    </bean>

    <!--调用类的静态变量-->
    <bean class="com.halulu.entity.Student" id="student4">
        <property name="age" value="#{T(java.lang.Math).PI}"></property>
    </bean>
    
    <!--调用类的静态方法-->
    以上是关于Springday01  maven依赖Spring介绍IOC模块IOC控制反转DI依赖注入SpEL表达式的主要内容,如果未能解决你的问题,请参考以下文章

maven 技术总结

01 基于注解的springmvc的第一个demo

使用Eclipse通过Maven搭建SSM框架

java框架-----spring框架------在自己的项目中如何用maven管理spring相关jar包

mvn package 打包时加入本地jar包

JAVA入门[3]—Spring依赖注入