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、
解耦的好处
- 解耦: 减少依赖关系。通常都是降低依赖关系,不一定做到0耦合,只需要达到松耦合。
- 好处: 更便于维护扩展。
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表达式的主要内容,如果未能解决你的问题,请参考以下文章