学习Spring5必知必会(2)~Spring的基本介绍和Spring基本使用、Spring的核心对象和管理bean的原理


一、Spring的基本介绍

1、spring 介绍:

Spring 是一个轻量级DI/IoC 和 AOP 容器开源框架,致力于构建致力于构建轻量级的 JavaEE 应用简化应用开发,本身涵盖了传统应用开发,还拓展到移动端,大数据等领域。

  • Spring FrameWork: Spring 全家桶的核心, Spring 的其他产品都是基于Spring FrameWork 框架的。



2、spring 优势:

① Spring 能帮我们低侵入/低耦合地根据配置文件 创建及组装对象之间的依赖关系。

② Spring 面向切面编程能帮助我们无耦合的实现日志记录,性能统计,安全控制等。

③ Spring 能非常简单的且强大的声明式事务管理(通过配置完成事务,不用修改代码)。

④ Spring 提供了与第三方数据访问框架(如 Hibernate、JPA)无缝集成,且自己也提供了一套 JDBC 模板来方便数据库访问。

⑤ Spring 提供与第三方 Web(如 Struts1/2、JSF)框架 无缝集成,且自己也提供了一套 Spring MVC 框架,来方便 Web 层搭建。

⑥ Spring 能方便的与如 Java Mail、任务调度、缓存框架等技术整合,降低开发难度。



3、spring FrameWork 框架的准备工作(框架压缩包、sts插件):

● spring 的官网:https://spring.io/

● 框架的压缩包下载地址:https://repo.spring.io/ui/native/libs-release-local/org/springframework/spring/

■ spring-frame 框架压缩文件介绍:
  • docs:Spring开发的帮助文档

  • libs:Spring核心组件的jar包、jar包的源码、jar包的文档

  • schema: Spring 配置文件的schema约束文件

● STS(Spring Tool Suite)工具下载地址:https://spring.io/tools

  • 咱安装eclipse 版本的sts4 应用程序(sts4工具的话就是在eclipse基础上套上了有利于spring开发的组件等)

  • 咱也可以安装 eclipse 版本的sts 插件:选择在线安装方式【步骤:help-》Eclipse Marketplace -》搜 Spring Tool即可



4、Spring 思想 之 IoC 和 DI 思想:

Spring 是一个DI容器或IoC容器(DI和IoC 思想差不多)。掌握着创建对象和构建对象之间的依赖的控制权

● IoC:Inversion of Control(控制反转):

读作“反转控制”,更好理解,不是什么新技术,而是一种设计思想。 其本意是是将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理

  • 反控:调用者只管负责从 Spring 容器中获取需要使用的对象,不关心对象的创建过程,也不关心该对象依赖对象的创建以及依赖关系的组装,也就是把创建对象的控制权反转给了 Spring 框架。

● DI:Dependency Injection(依赖注入):

读作“注入依赖”,更好理解,不是什么新技术,而是一种设计思想

  • 依赖注入:从字面上分析,IoC是指将对象的创建权,反转给了 Spring 容器; 具体是指 Spring 创建对象的过程中,将对象依赖属性(常量,对象,集合)通过配置设值给该对象。



二、Spring基本使用(Spring的开发步骤)

1、依赖jar包:

  • spring-beans.jar
  • spring-core.jar
  • commons-logging.jar


2、配置(创建applicationContext.xml 配置文件):

  • 使用sts工具:步骤【new -》Spring Bean Configuration File -》...】

  • 安装sts工具默认是没有配带Spring Roo ,需要自己额外再安装一下Spring Roo 插件,右键文件才有 Spring Bean Configuration File

图片.png
  • 没安装sts 的时候,先创建一个普通的xml文件,然后到Spring Frame文档的Core 搜 beans 找到配置文件的约束内容

    <!-- 配置的约束内容 -->
    <?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">
        
        <!-- 通过配置的bean元素,告诉Spring的IoC容器,需要管理哪一个类的对象 -->
      <bean id="hello" class="com.shan.hello.Hello">
               <!-- 通过property子元素,设置管理对象的属性的值 -->
          <property name="password" value="123"/>
          <property name="username" value="shan"/>
        </bean>
        
    </beans>     
    


3、使用:

    @Test
    void testIoC() throws Exception {
        Hello hello = null;
        //=========================
        //1、加载配置文件:从classpath路径去寻找配置文件,创建资源对象
        Resource resource = new ClassPathResource("applicationContext.xml");    
        //2、创建IoC容器:创建spring的工厂对象(IoC容器对象)
        BeanFactory factory = new XmlBeanFactory(resource);
        //3、从Ioc容器获取对象:从spring IoC 容器(就是factory 工厂对象)中获取指定名称的对象
        hello = (Hello)factory.getBean("hello");
        //=========================
        hello.printUser();
    }


■ 从例子,可以看出,spring不仅帮我们创建对象,还帮我们把对象需要的数据给设置进来(对象的属性依赖)


✿ 总结spring的开发步骤:

1、准备jar包

2、开发一个实例类

3、在applicationContext.xml 完成配置(注意约束xsd的内容可以到官网的Core那一章节进行拷贝)

4、启动Spring容器

5、从Spring容器中获取指定名称的bean对象

6、调用bean对象的方法



4、从Spring IoC容器中获取bean对象的方式【推荐使用:bean的名称+类型】

  • 方式三(推荐): T getBean(String name, Class<T> requiredType) 根据bean对象在容器中的 名称+类型 来获取
    • hello = factory.getBean("hello", Hello.class);
    //使用spring框架
    @Test
    void testIoC() throws Exception {
        Hello hello = null;
        //=========================
        //1、加载配置文件:从classpath路径去寻找配置文件,创建资源对象
        Resource resource = new ClassPathResource("applicationContext.xml");    
        //2、创建IoC容器:创建spring的工厂对象(IoC容器对象)
        BeanFactory factory = new XmlBeanFactory(resource);
        //3、从Ioc容器获取对象:从spring IoC 容器(就是factory 工厂对象)中获取指定名称的对象
        //方式一: Object getBean(String name) 根据bean对象在容器中的名称来获取
//      hello = (Hello)factory.getBean("hello");
        //方式二: T getBean(Class<T> requiredType) 根据bean对象在容器中的类型来获取
//      hello = factory.getBean(Hello.class);
        //方式三(推荐): T getBean(String name, Class<T> requiredType) 根据bean对象在容器中的 名称+类型 来获取
        hello = factory.getBean("hello", Hello.class);
        //=========================
        hello.printUser();
    }



5、spring 的基本配置

1、bean元素使用属性推荐id,而非name

2、元素:<import resource="com/shan/hello.xml"/> 用于引入spring的配置文件,相当于js中的元素 <javaScript src=""/> (推荐resource路径加上前缀 classpath)

□ 例如咱的hello.xml 全路径是:F/spring-base/src/com/shan/hello.xml

  • 要注意,默认情况下,resource 是从 classpath 的跟路径寻找

  • 可以使用前缀来定位文件的基础位置(就是加上前缀,常用的前缀是classpath),即

    <import resource="classpath:com/shan/hello.xml"/>



三、Spring的核心对象和管理bean的原理

1、Spring的核心对象:

  • BeanFactory:是Spring的IoC容器(容器--管理对象的生命周期),生产 bean 对象的工厂,负责配置,创建和管理 bean。

  • bean:被 Spring IoC 容器管理的对象称之为bean。


2、Spring IoC 容器如何知道它需要管理哪些对象:

---Spring IoC 容器通过读取配置文件中的配置元数据,通过元数据对应用中的各个对象进行实例化及装配。


■ 元数据的配置有三种方式:

□ XML-based configuration (xml配置文件)

□ Annotation-based configuration (注解)

□ Java-based configuration (基于java代码)


3、Spring 管理bean的原理【底层是:反射(获取构造器实例对象)+内省机制(设置属性值)】:

① 通过 Resource 对象加载配置文件
② 解析配置文件,得到指定名称的 bean
③ 解析 bean 元素,id 作为 bean 的名字,class 用于反射得到 bean 的实例
  • 注意:此时,bean 类必须存在一个无参数构造器(且该无参构造器和访问权限无关);
④ 调用 getBean 方法的时候,从容器中返回对象实例;
■ 结论:就是把代码从 JAVA 文件中转移到了 XML 中。
    
/* 实体类Hello */
public class Hello {
    private String password;
    private String username;
    
    private Hello() {};//bean 类必须存在一个无参数构造器`(且该无参构造器和访问权限无关);可以是public,也可以是private 

    public void setPassword(String password) {
        this.password = password;
    }
    
    public void setUsername(String username) {
        this.username = username;
    }
    
    public void printUser() {
        System.out.println("hello " + username + ", your password is " + password);

    }
}

/* 测试类 */
//简单模拟spring IoC容器的操作【管理对象的创建、管理对象的依赖关系,例如属性设置】
    @Test
    void testIoCMock() throws Exception {
        String className = "com.shan.hello.Hello";
        Hello hello = null; 
        //================================
        //实例Hello对象-反射常用的方法,调用Class类中的newInstance();
//      Object obj = Class.forName(className).newInstance();//因为通过测试得知实体必须存在一个(与访问性无关的)构造器,
        //所以不是直接通过Class类的newInstance方法,而是先通过反射构建构造器Constructor,然后通过调用构造器Constructor的newInstance方法创建实例对象
        //反射机制获取构造器
        Class clazz = Class.forName(className);
        Constructor con = clazz.getDeclaredConstructor();
        con.setAccessible(true);//设置构造器的可访问性
        Object obj = con.newInstance();
        hello = (Hello)obj;
        //内省机制操作javaBean属性
        BeanInfo beanInfo = Introspector.getBeanInfo(clazz, Object.class);
        PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
        for (PropertyDescriptor pd : pds) {
            //当前的属性的属性名
            String propertyName = pd.getName();
            if("username".equals(propertyName)) {
                pd.getWriteMethod().invoke(hello,"shan");
            }else if("password".equals(propertyName)) {
                pd.getWriteMethod().invoke(hello, "123");
            }   
        }
        
        hello.printUser();
    }



写在后面的话

       如果你觉得一乐的文章给您带来了一些收获,可以给个三连❤️ ,一乐会一如既往地更新有价值的博客。如果文章存在错误,也欢迎大家指出。还有,如果大家有什么好的学习技巧、学习感悟,也非常欢迎大家在评论区一起交流~

最后感谢大家的支持,谢谢~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容