专栏首页SpringBoot图文教程「2020最新」Spring最易学习教程—第一个Spring程序

「2020最新」Spring最易学习教程—第一个Spring程序

1 Spring简介

Spring 是一款轻量级的JavaEE开发框架,其对比的EJB是Sun官方力推的JavaEE解决方案。使用EJB编码必须要实现EJB的组件,必须运行在支持EJB的服务器中,无论是测试还是运行都十分不便。Spring能够非侵入的解决JavaEE的通用问题,在测试、运行、扩展等方面比EJB强大的多。

Spring构建于众多优秀的设计模式之上:工厂设计模式代理设计模式、模板方法设计模式、策略设计模式...

设计模式:前人总结好的,用于解决特定问题的方案。

学习Spring的核心就是学习其应用的设计模式本身要解决那些问题。

2 工厂设计模式

工厂设计模式:使用工厂创建对象,代替new创建对象。

new模式的问题:

new模式下,类和类之间是强耦合的。

解决方案:工厂设计模式(解耦合)

  1. 配置一个properties文件
userService=com.bcl.service.impl.UserServiceImpl
创建BeanFactory工厂类
public class BeanFactory {
 private static Properties prop = new Properties();
 static{
 //通过流读取配置文件,保存到prop
        InputStream in = BeanFactory.class.getResourceAsStream("/applicationContext.properties");
 try {
            prop.load(in);
        } catch (IOException e) {
            e.printStackTrace();
 throw new RuntimeException(e);
        }finally{
 if(in != null){
 try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
 public static Object getBean(String id){

 //获取类对象
        Object o = null;
 try {
            Class c = Class.forName(prop.getProperty(id));
            o = c.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
 throw new RuntimeException(e);
        }
 //创建对象
 return o;
    }
}
  1. 面向接口编程
UserService service = (UserService) BeanFactory.getBean("userService");

工厂设计模式的特点:配置文件+反射+面向接口编程

通过工厂模式,解开了类和类之间强耦合,提高了程序的可维护性和可扩展性,满足开闭原则。

3 第1个Spring程序

Spring框架的基本作用:对象工厂(容器)。可以借助Spring工厂创建(获取)对象,解开类和类之间的耦合,提高程序的维护性和扩展性。

3.1 Spring工厂的使用步骤

导入依赖
<dependency>
 <groupId>org.springframework</groupId>
 <artifactId>spring-context</artifactId>
 <version>4.3.26.RELEASE</version>
</dependency>
导入配置文件
applicationContext.xml位置任意,建议放置在resources根目录下。
<bean id="标识" class="全类名"/>
创建Spring工厂,获取对象
Spring中工厂类型:ApplicationContext(接口)
 
  实现类:
      非web环境:ClassPathXmlApplicationContext
      web环境:XmlWebApplicationContext
 
     方法:
 Object getBean(String id);

3.2 Spring工厂实战

  1. 创建一个业务类
配置applicationContext.xml
<bean id="userService" class="com.bcl.service.impl.UserServiceImpl"/>
创建Spring工厂,获取对象
//创建Spring工厂
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
//从工厂中获取UserService
UserService userService = (UserService)applicationContext.getBean("userService");
userService.deleteUserById(1);

4 Spring框架的组成模块

  1. Test:简化Spring代码的测试
  2. 核心容器:Spring作为对象工厂的实现
  3. AOP和Aspects:面向切面编程,非侵入的为现有代码提供增强功能
  4. 辅助功能
  5. 数据访问:提供了访问数据库的功能
  6. Web模块:提供了对Web开发的支持

Spring提供了一套完整的企业应用开发方案,同时还能和其它框架整合(Struts2、MyBatis)。在发展中,Spring族系涌现出一系列的优秀的子框架,最终发展成一个开发生态。Spring族系有名的框架:SpringMVC、SpringBoot、SpringCloud、SpringData、SpringSecurity、SpringTask...

5 Spring工厂实现原理

Spring工厂创建对象:读取配置文件(applicationContext.xml),获取到全类名,通过反射默认调用无参构造方法创建对象。

bean标签的scope属性设置对象是否单例:

singleton (单例 默认值) prototype (多例)

为什么单例是默认策略?节省内存空间

可以被用户公用的对象(单例): Dao、service、SqlSessionFactory 不能被用户公用的对象(多例): connection、sqlSession、Cart、Action

6 注入(Injection)

给对象的属性赋值(注入值)。

6.1 Set注入

本质:通过无参构造方法创建对象后,调用对象属性的set方法进行赋值。

操作:在bean标签中,通过property子标签为对象的属性进行set注入。

6.1.1 基本类型(包装类)+String

<bean id="s" class="com.bcl.entity.Student">
    <!-- name属性:对象的属性名
   value子标签体:对象的属性值
 -->
    <property name="id">
        <value>1</value>
    </property>
    <property name="name">
        <value>xiaohei</value>
    </property>
    <property name="age">
        <value>18</value>
    </property>
    <property name="score">
        <value>100.0</value>
    </property>
</bean>

<bean id="s" class="com.bcl.entity.Student">
    <!-- name属性:对象的属性名
   value属性:对象的属性值
 -->
 <property name="id" value="1"/>
        <property name="name" value="xiaohei"/>
        <property name="age" value="18"/>
        <property name="score" value="100.0"/>
</bean>

6.1.2 自定义对象类型

<bean id="a" class="com.bcl.entity.Address">
    <property name="city" value="郑州"/>
    <property name="street" value="文化路"/>
</bean>
<bean id="p" class="com.bcl.entity.Person">
    <property name="addr">
        <!--
    ref标签的bean属性:另外一个bean的id值
  -->
        <ref bean="a"/>
    </property>

    <property name="id" value="1"/>
    <property name="personName" value="xiaohei"/>
</bean>


<bean id="p" class="com.bcl.entity.Person">
    <!--
  ref属性:另外一个bean的id值
 -->
    <property name="addr" ref="a"/>
    <property name="id" value="1"/>
    <property name="personName" value="xiaohei"/>
</bean>

6.1.3 数组、List和Set

<bean id="u" class="com.bcl.entity.User">
    <property name="id" value="1"/>
    <property name="name" value="xiaohei"/>

    <property name="os">
        <!-- 
   array标签表示一个数组
   元素是简单数据用value子标签
   元素是自定义类型数据用ref子标签
  -->
        <array>
            <value>1</value>
            <value>100.0</value>
            <value>hhh</value>
            <ref bean="a"/>
        </array>
    </property>

    <property name="list">
        <!-- 
   list标签表示一个List集合
   元素是简单数据用value子标签
   元素是自定义类型数据用ref子标签
  -->
        <list>
            <value>1</value>
            <value>hhh</value>
            <ref bean="a"/>
            <ref bean="a2"/>
        </list>
    </property>

    <property name="set">
        <!-- 
   set标签表示一个Set集合
   元素是简单数据用value子标签
   元素是自定义类型数据用ref子标签
  -->
        <set>
            <value>1</value>
            <value>1</value>
            <value>hhh</value>
            <ref bean="a"/>
            <ref bean="a2"/>
        </set>
    </property>
</bean>

6.1.4 Map和Properties

<bean id="u" class="com.bcl.entity.User">
    <property name="map">
        <map>
            <entry key="k1"><value>v1</value></entry>
            <entry key="k2" value="v2"/>
            <entry key="k3" value-ref="a"/>
            <entry key-ref="p" value-ref="a"/>
        </map>
    </property>

    <property name="prop">
        <props>
            <prop key="pk1">pv1</prop>
            <prop key="pk2">pv2</prop>
        </props>
    </property>
</bean>

6. 2 构造注入

本质:调用有参构造方法创建对象的同时,为属性赋值。

前提:必须要提供有参构造

操作:在bean标签中定义constructor-arg子标签。

6.2.1 基本使用

当一个类中的多个有参构造方法的参数个数不同时,constructor-arg标签会根据数量匹配构造方法进行调用
<bean id="b1" class="com.bcl.entity.Book">
        <constructor-arg value="1"/>
        <constructor-arg value="十万个为什么"/>
        <constructor-arg value="100000.0"/>
        <constructor-arg value="佚名"/>
    </bean>

6.2.2 type属性

当一个类中的构造方法,形参个数相同,类型不同时,通过type属性明确形参类型,调用指定构造方法。
<bean id="b1" class="com.bcl.entity.Book">
    <constructor-arg value="1" type="java.lang.Integer"/>
</bean>

6.2.3 index属性

index属性设置形参的下标,从0开始
<bean id="b1" class="com.bcl.entity.Book">
        <constructor-arg value="1" type="java.lang.Integer" index="0"/>
        <constructor-arg value="十万个为什么" type="java.lang.String" index="1"/>

    </bean>

6.3 自动装配

本质:Spring自动分析属性,调用属性的set方法完成赋值。

操作:通过bean标签的属性 autowire = "byType"|"byName"

 <bean id="bookService" class="com.bcl.service.impl.BookServiceImpl"/>
    <!--<bean id="bookService2" class="com.bcl.service.impl.BookServiceImpl"/>-->

<!--
 byType:根据属性的类型,在Spring容器中获取需要的对象
  注意此时Spring中该类型的对象必须唯一

 byName:根据属性的名字,在Spring容器找id="属性名"的对象
-->
    <bean id="bookAction" class="com.bcl.action.BookAction" autowire="byType">
    </bean>

本文分享自微信公众号 - 鹿小洋的Java笔记(lulaoshiJava),作者:编程鹿

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-07-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 「2020最新」Spring最易学习教程—IOC 以及 整合Struts2

    public class ConnectionFactoryBean implements FactoryBean<Connection> {

    鹿老师的Java笔记
  • 「2020最新」Spring最易学习教程—IOC 以及 整合Struts2

    应用复杂时,需要将配置文件拆分成多个小的配置文件,放置到不同模块,最后在总配置文件中通过import标签引入其它的小配置文件。

    鹿老师的Java笔记
  • 「2020最新」Spring最易学习教程 4—整合Mybatis 事务控制

    到目前为止web.xml中出现的标签:servlet filter listener context-param。

    鹿老师的Java笔记
  • 「2020最新」Spring最易学习教程 4—整合Mybatis 事务控制

    到目前为止web.xml中出现的标签:servlet filter listener context-param。

    鹿老师的Java笔记
  • 「2020最新」Spring最易学习教程 3— 代理设计模式 Spring AOP 动态代理原理

    在程序中,Action(租客) 和 Serivce(房东) 的矛盾,也可以通过添加一个代理类解决。

    鹿老师的Java笔记
  • 「2020最新」Spring最易学习教程 3— 代理设计模式 Spring AOP 动态代理原理

    在程序中,Action(租客) 和 Serivce(房东) 的矛盾,也可以通过添加一个代理类解决。

    鹿老师的Java笔记
  • spring cloud系列教程第一篇-介绍

    现在Java招聘中最常见的是会微服务开发,微服务已经在国内火了几年了,而且也成了趋势了。那么,微服务只是指spring boot吗?当然不是了,微服务需要治理,...

    凯哥Java
  • Spring Cloud 2020.0.4 发布,安排!

    虽然 Spring Cloud 的发布节奏远没有 Spring Boot 月更那么快,但一年发上好几个版本也是吃不消的,我表示学不动了,也升级不动了。。

    Java技术栈
  • Spring Cloud 2020.0.0 正式发布,全新颠覆性版本!

    感谢Java技术栈群友通知,想入群的在公众号Java技术栈后台回复:wx,正在使用 Spring Cloud 的同学有没有觉得奇怪,用的好好的英国伦敦地铁站,版...

    Java技术栈
  • Spring Cloud面试题(2020最新版)

    Java面试总结汇总,整理了包括Java基础知识,集合容器,并发编程,JVM,常用开源框架Spring,MyBatis,数据库,中间件等,包含了作为一个Java...

    Java架构师必看
  • Java学习之路 -- Java怎么学?

    当时,作为懵懂的小白,大一学习了c和c++,还有数据结构,后来才自学的java。有了c++的基础,其实学java确实感觉挺容易上手。如果没有c或者c++的基础,...

    秦怀杂货店
  • 2020 年 Java 程序员应该学习什么?

    大家好,我相信大家在新的一年都有一个良好的开端,并准备好制定一个提升自我技术的目标。作为 Java 开发人员,我还制定了一些目标,希望在今年成为一名更好的 Ja...

    武培轩
  • Spring Boot 要怎么学?要学哪些东西?要不要先学 SSM?松哥说说看法

    公众号后台回复 SpringBoot,免费获取 274 页SpringBoot修炼手册。

    江南一点雨
  • 2020年你将会选择哪个微服务框架?

    截至2020年,Java仍然是构建Web应用程序的最流行的编程语言之一,尽管它必须面对来自Go,Python和TypeScript等新型语言的激烈竞争。

    用户1516716
  • Spring cloud系列教程第十篇- Spring cloud整合Eureka总结篇

    Spring cloud系列教程第十篇- Spring cloud整合Eureka总结篇

    凯哥Java
  • 在微服务项目中,Spring Security 比 Shiro 强在哪?

    虽然目前 Spring Security 一片火热,但是 Shiro 的市场依然存在,今天我就来稍微的说一说这两个框架的,方便大家在实际项目中选择适合自己的安全...

    江南一点雨
  • 按照这个java技术路线学习,分分钟搞定面试官,进大厂不是梦

    怎么说呢,最近几年的时间里,对于java开发人员来说,都知道java生态诞生了很多东西.每半年更新一次版本,发布了很多的流行的框架,像Spring5,Sprin...

    叫我可儿呀
  • 2021升级版微服务教程2—微服务开发环境准备

    2021升级版SpringCloud教程从入门到实战精通「H版&alibaba&链路追踪&日志&事务&锁」

    鹿老师的Java笔记
  • Spring Boot升级到2.x,Jackson对Date时间类型序列化的变化差点让项目暴雷【享学Spring Boot】

    在阅读本文之前,建议你已经掌握了Jackson的知识以及它的Spring、Spring Boot下的集成和运用。

    YourBatman

扫码关注云+社区

领取腾讯云代金券