前言
从这篇文章开始我们就继续开始学习我们的Java,今天开始我们学习Spring相关知识,内容较多,我们分篇幅讲解记录~
学习内容
什么是Spring?
Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。Spring框架的核心是IOC容器和AOP面向切面编程。
Spring体系结构
这里我推荐看一下这篇文章的介绍,图文结合很详细。 Spring体系结构参考
传统编码方式的不足
现在我们设想一个问题:三个孩子喜欢吃三种不同品种的苹果,我们需要对其进行合理分配。
我们使用传统编码方式的实现思路为:
-
新建苹果的实体类Apple,添加set和get方法以及默认的构造方法和初始化构造方法; -
新建孩子的实体类Child,添加set和get方法以及默认的构造方法和初始化构造方法和一个自定义eat方法; -
新建主类及main方法,main方法中首先初始化三种苹果个三个孩子,然后调用对用的eat方法; -
运行结果; 不足: -
代码固定,修改时必须修改源代码。 -
对象之间是硬关联关系。
尝试使用Spring IOC
同样是上面的问题,这里我们使用Spring解决这个问题。
- 保持Apple和Chid实体类不变;
- 在pom.xml中引入Spring依赖;
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
</dependencies>
- 在resources文件夹下新建applicationContext.xml文件;
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/beans ">
<bean id="sweetApple" class="com.imooc.spring.ioc.entity.Apple">
<property name="title" value="红富士"></property>
<property name="origin" value="欧洲"></property>
<property name="color" value="红色"></property>
</bean>
<bean id="sourApple" class="com.imooc.spring.ioc.entity.Apple">
<property name="title" value="青苹果"></property>
<property name="origin" value="中亚"></property>
<property name="color" value="绿色"></property>
</bean>
<bean id="softApple" class="com.imooc.spring.ioc.entity.Apple">
<property name="title" value="金帅"></property>
<property name="origin" value="中国"></property>
<property name="color" value="黄色"></property>
</bean>
<bean id="lily" class="com.imooc.spring.ioc.entity.Child">
<property name="name" value="莉莉"/>
<property name="apple" ref="softApple"/>
</bean>
<bean id="andy" class="com.imooc.spring.ioc.entity.Child">
<property name="name" value="安迪"/>
<property name="apple" ref="rdApple"/>
</bean>
<bean id="luna" class="com.imooc.spring.ioc.entity.Child">
<property name="name" value="露娜"/>
<property name="apple" ref="sweetApple"/>
</bean>
</beans>
- 新建主类和main方法;
- 测试结果
初始化IOC容器
Bean的管理
配置Bean的三种方式:
- 基于XML配置Bean
- 基于注解配置Bean
- 基于Java代码配置Bean
实例化Bean的三种方式:
<bean id="apple1" class="com.imooc.spring.ioc.entity.Apple">
</bean>
<bean name="apple2" class="com.imooc.spring.ioc.entity.Apple">
<constructor-arg name="title" value="红富士"/>
<constructor-arg name="color" value="红色"/>
<constructor-arg name="origin" value="欧洲"/>
<constructor-arg name="price" value="19.8"/>
</bean>
<bean id="apple3" class="com.imooc.spring.ioc.entity.Apple">
<constructor-arg index="0" value="红富士"/>
<constructor-arg index="1" value="欧洲"/>
<constructor-arg index="2" value="红色"/>
<constructor-arg index="3" value="19.8"/>
</bean>
- 基于静态工厂实例化
<bean id="apple4" class="com.imooc.spring.ioc.factory.AppleStaticFactory"
factory-method="createSweetApple"/>
- 基于工厂实例方法实例化
<bean id="factoryInstance" class="com.imooc.spring.ioc.factory.AppleFactoryInstance"/>
<bean id="apple5" factory-bean="factoryInstance" factory-method="createSweetApple"/>
从IOC容器获取bean
ApplicationContext context = new ClassPathXmlApplicationContext(configLocations);
Apple apple4 = context.getBean("apple4", Apple.class);
路径表达式
依赖注入
依赖注入是指运行时将容器内对象利用反射赋给其他对象的操作。
利用setter实现对象依赖注入
<bean id="sweetApple" class="com.imooc.spring.ioc.entity.Apple">
<property name="title" value="红富士"/>
<property name="color" value="红色"/>
<property name="origin" value="欧洲"/>
<property name="price" value="19.8"/>
</bean>
<bean id="lily" class="com.imooc.spring.ioc.entity.Child">
<property name="name" value="莉莉"/>
<property name="apple" ref="sweetApple"/>
</bean>
利用构造方法实现对象依赖注入
<bean id="sourApple" class="com.imooc.spring.ioc.entity.Apple">
<property name="title" value="青苹果"/>
<property name="color" value="绿色"/>
<property name="origin" value="中亚"/>
<property name="price" value="9.8"/>
</bean>
<bean id="andy" class="com.imooc.spring.ioc.entity.Child">
<constructor-arg name="name" value="安迪"/>
<constructor-arg name="apple" ref="sourApple"/>
</bean>
注入集合对象
注入List
<bean id="***" class="***">
<property name="someList">
<list>
<value>具体值</value>
<ref bean="beanId"></ref>
</list>
</property>
</bean>
注入Set
<bean id="***" class="***">
<property name="someSet">
<set>
<value>具体值</value>
<ref bean="beanId"></ref>
</set>
</property>
</bean>
Tip:List和Set的区别在于List允许数据重复,Set不允许数据重复!
注入Map
<bean id="***" class="***">
<property name="someMap">
<map>
<entry key="k1" value="v1"></entry>
<entry key="k2" value-ref="beanId"></entry>
</map>
</property>
</bean>
注入Properties
<bean id="***" class="***">
<property name="someProperties">
<props>
<prop key="k1">v1</prop>
<prop key="k2">v2</prop>
</props>
</property>
</bean>
查看IOC容器内对象
String[] beanNames = context.getBeanDefinitionNames();
for (String beanName:beanNames){
System.out.println(beanName);
System.out.println("类型:" + context.getBean(beanName).getClass().getName());
System.out.println("内容:" + context.getBean(beanName));
}
bean scope属性
- bean scope属性用于决定对象何时被创建与作用范围
- bean scope配置将影响容器对象的数量
- bean scope默认值singleton(单例),指全局共享同一个对象实例
bean对象生命周期
基于注解配置bean
前面我们在学习bean的管理的时候我们提到了配置bean的三种方式,现在我们来学习一下基于注解配置bean。
组件类型注解
声明当前类的功能与职责
注解 | 说明 |
---|
@Component | 组件注解,通用注解,被该注解描述的类将被IOC容器管理并实例化 | @Controller | 语义注解 ,说明当前类是MVC应用中的控制器类 | @Service | 语义注解,说明当前类是Service业务服务类 | @Repository | 语义注解,说明当前类用于业务持久层,通常描述对应的Dao类 |
使用注解开发的时候我们的xml配置文件如下:
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:property-placeholder location="classpath:config.properties"/>
<context:component-scan base-package="com.imooc"/>
</beans>
自动装配注解
根据属性特征自动注入对象 推荐使用@Resource按名称匹配。
元数据注解
更细化的辅助IOC容器管理对象
JavaConfig
对象实例化与依赖注入
Spring与JUnit4整合
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
- 在测试类中引入注解
总结
通过本篇文章我们对于Spring有了一个基本的认识,如果你在文中发现有任何错误,欢迎评论区交流~
|