beanfactory篇-(一)基本概念介绍-九零后大叔的技术博客

沙海
沙海
沙海
1017
文章
2
评论
2021年4月24日09:10:31
评论
2 5393字阅读17分58秒
摘要

文章说明: 对于很多初学者而言,我们经常说spring框架,用spring框架,可是spring到底是一个什么东西,我们好像没有一个很具象的认识。我们把应用打成jar包或者war包后,把war包丢到tocat的webapp是目录或者通过命令行启动jar包,我的应用就启动了(我们也知道spring框架启动了)。但是这个启动过程对于我们是一个黑盒 ,我们不知道这个过程到底做了什么,以至于我们再修改各种配置的时候,经常犯错,导致一些简单的错误使我们一两天停滞不前。本系列文章旨在描述清楚spring的相关概念,然后使大家对spring有个更加深入的认识。

文章说明: 对于很多初学者而言,我们经常说spring框架,用spring框架,可是spring到底是一个什么东西,我们好像没有一个很具象的认识。我们把应用打成jar包或者war包后,把war包丢到tocat的webapp是目录或者通过命令行启动jar包,我的应用就启动了(我们也知道spring框架启动了)。但是这个启动过程对于我们是一个黑盒 ,我们不知道这个过程到底做了什么,以至于我们再修改各种配置的时候,经常犯错,导致一些简单的错误使我们一两天停滞不前。本系列文章旨在描述清楚spring的相关概念,然后使大家对spring有个更加深入的认识。

1. spring的基础概念介绍

[1] 什么是spring?
Spring是一个开源的轻量级的Java开发框架。落地到我们项目使用层面,就是spring的一系列依赖的jar包,就是我们使用的那些applicationContext.xml配置文件的内容,那些注解,那些spring的相关类。

[2] beanFactory和applicationContex区别。
二者都可以理解为是spring的具体落地实现,但是二者的落地程度不一样。打个比方,我们买车的时候有标配版和豪华版,这两种车都能完成我们的代步功能。但是前者能完成基本代步,而后者再内饰,外观,发动机,续航等等功能点上做的更加的优越。beanFactory可以理解为是spring的最基础最核心的实现,而applicationContext是基于beanFactory这个最基础最核心实现的丰富其它功能扩展。

[3] 什么是spring容器(环境)?
一个beanFactory实例对象或者applicationContext实例对象就是一个spring容器或者说是一个spring环境。

[4] 什么是启动spring容器(环境)?
从工作的角度来说,就是启动一个基于spring的web或者非web应用(定时类应用或者纯消息消费类应用);而从学习spring原理的角度来理解,可以理解为是创建了一个beanFactory或者appicationContex对象的过程,就是启动了一个spring容器或者说启动了一个spring环境。这二者本质都是一样的,只是站的角度不一样。

[5] spring启动过程和运行过程的区别。
创建一个beanFactory或者appicationContex对象过程就是spring启动过程(例如:new XmlBeanFactory(), new ClassPathXmlApplicationContext())。创建前面的两个对象后,使用beanFactory或者appicationContex对象的get方法等核心功能方法就是spring的运行过程(例如:beanFactory.getBean()。applicationContext有一点不一样,new ClassPathXmlApplicationContext()这个对象的时候就完成了启动和运行过程)。

[6] springMVC是什么?
和Strut2一样,是一个MVC框架,不同点在于springMVC是基于spring的,而Strut2可以不依赖于spring使用。

了解上述的概念之后,我们简单的使用一下最简单的spring容器看看,这种用法不同于我们工作中启动web的jar包或者war包的形式,但是底层基本上是一致的。在正式使用之前我们先创建一个maven的web项目工程,如下图所示:

beanfactory篇-(一)基本概念介绍-九零后大叔的技术博客

2. xml方式配置bean

第一步:在model目录下创建一个User实体类

@Data
@NoArgsConstructor
@ToString
@EqualsAndHashCode
public class User implements Serializable {

    private static final long serialVersionUID = 4800166777883697833L;

    private Long id;
    private String name;
    private String identity;
    private String mobile;
    private String bankcard;
    private Integer age;
    private Integer gender;

}

第二步:在service目录下创建如下的接口和接口实现类

public interface UserService {

    User findUserById(Long id);

}

public class UserServiceImpl implements UserService {

    @Override
    public User findUserById(Long id) {

        User user = new User();
        user.setId(id);
        user.setName("张山");
        user.setIdentity("张山");
        user.setBankcard("36457736355363");
        user.setMobile("16752652625");
        user.setGender(2);
        user.setAge(18);

        return user;
    }

}

第三步:创建好一个web工程之后,我们在resource目录下创建一个spring的标准配置文件,即appicationContext.xml文件,然后配置一下userService这个bean

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

    <!--userServiceImpl这个bean-->
    <bean id="userService" name="userService" class="com.minesoft.tutorial.service.UserServiceImpl"
          scope="singleton"
          autowire="byType"
          abstract="false"
          lazy-init="true"
    />

</beans>

第四步:完成上述的若干处理后,我们就可以使用两种方式启动一个spring环境了。

方式一:通过创建BeanFactory对象的方式启动一个spring容器

    XmlBeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
    UserService userService = beanFactory.getBean(UserService.class);
    User user = userService.findUserById(100L);
    System.out.println(JSONObject.toJSONString(user));

方式二:通过创建ApplicationContext对象的方式启动一个spring容器

    ClassPathXmlApplicationContext cac = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
    UserService userService = cac.getBean(UserService.class);
    User user = userService.findUserById(100L);
    System.out.println(JSONObject.toJSONString(user));

3. 注解的方式配置bean

第一步:在model目录下创建一个User实体类

@Data
@NoArgsConstructor
@ToString
@EqualsAndHashCode
public class User implements Serializable {

    private static final long serialVersionUID = 4800166777883697833L;

    private Long id;
    private String name;
    private String identity;
    private String mobile;
    private String bankcard;
    private Integer age;
    private Integer gender;

}

第二步:在service目录下创建如下的接口和接口实现类

public interface UserService {

    User findUserById(Long id);

}

public class UserServiceImpl implements UserService {

    @Override
    public User findUserById(Long id) {

        User user = new User();
        user.setId(id);
        user.setName("张山");
        user.setIdentity("张山");
        user.setBankcard("36457736355363");
        user.setMobile("16752652625");
        user.setGender(2);
        user.setAge(18);

        return user;
    }

}

第三步:我们配置一下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 http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
       ">

    <!--让spring启动过程扫描带由@Controller,@Service,@Component的类,并管理这些类的创建和销毁工作-->
    <context:component-scan base-package="com.minesoft.tutorial" />

</beans>

第四步:完成上述的若干处理后,我们就可以使用两种方式启动一个spring环境了。

方式一:通过创建BeanFactory对象的方式启动一个spring容器

    XmlBeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
    UserService userService = beanFactory.getBean(UserService.class);
    User user = userService.findUserById(100L);
    System.out.println(JSONObject.toJSONString(user));

方式二:通过创建ApplicationContext对象的方式启动一个spring容器

    ClassPathXmlApplicationContext cac = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
    UserService userService = cac.getBean(UserService.class);
    User user = userService.findUserById(100L);
    System.out.println(JSONObject.toJSONString(user));

大叔格言: 把自己日常的学习心得做好笔记,这些笔记在将来的某一天会是一笔宝贵的财富。

beanfactory篇-(一)基本概念介绍-九零后大叔的技术博客

更多知识请关注公众号

继续阅读
weinxin
资源分享QQ群
本站是一个IT技术分享社区, 会经常分享资源和教程; 分享的时代, 请别再沉默!
沙海
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: