Spring基础知识回顾(1)

前言

从这篇文章开始我们就继续开始学习我们的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 ">
    <!-- 在IoC容器启动时,自动由Spring实例化Apple对象,取名sweetApple放入到容器中 -->
    <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标签默认通过默认构造方法创建对象-->
<bean id="apple1" class="com.imooc.spring.ioc.entity.Apple">

</bean>
<!--使用带参构造方法实例化对象-->

<!-- 基于name名称设置参数-->
<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>
<!-- 基于index位置设置参数-->
<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">
  <!-- IoC容器自动利用反射机制运行时调用setXXX方法为属性赋值 -->
   <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="莉莉"/>
    <!-- 利用ref注入依赖对象 -->
	<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容器内对象

//获取容器内所有beanId数组
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">
    <!--通知Spring IoC容器初始化时加载属性文件-->
    <context:property-placeholder location="classpath:config.properties"/>
    <!-- 在IoC容器初始化时自动扫描四种组件类型注解并完成实例化
        @Repository
        @Service
        @Controller
        @Component
     -->
    <context:component-scan base-package="com.imooc"/>
</beans>
自动装配注解

根据属性特征自动注入对象
在这里插入图片描述
请添加图片描述
推荐使用@Resource按名称匹配。
请添加图片描述

元数据注解

更细化的辅助IOC容器管理对象
在这里插入图片描述
请添加图片描述

JavaConfig

在这里插入图片描述

对象实例化与依赖注入

请添加图片描述

Spring与JUnit4整合

  • pom.xml引入
<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有了一个基本的认识,如果你在文中发现有任何错误,欢迎评论区交流~

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值