0


Spring框架原理 | IOC/DI | Bean

在这里插入图片描述

💗wei_shuo的个人主页

💫wei_shuo的学习社区

🌐Hello World !


文章目录

☢Spring框架

在这里插入图片描述

Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。

  • 目的:解决企业应用开发的复杂性

  • 功能:使用基本的JavaBean代替EJB

  • 范围:任何Java应用

    Spring + Spring MVC = Spring Boot

☢Spring架构图

💨组件介绍:

💫核心容器(IOC)

Core、Beans、Context、EL模块

  • Core模块:封装框架依赖的最底层部分,包括资源访问、类型转换及一些常用工具类
  • Beans模块:提供了框架的基础部分、包括反转控制和依赖注入。其中Beans Factory是容器核心,本质是"工厂设计模式"的实现,而且无需编程实现"单例设计模式",单例完全由容器控制,而且提倡面向接口编程,而非面向实现编程;所有应用程序对象及对象间关系由框架管理,从而真正把你从程序逻辑中吧维护对象之间的依赖关系提取出来,所有这些依赖关系都由BeansFactory来维护
  • Context模块:以Core和Beans为基础,集成Beans模块功能并添加资源绑定、数据验证、国际化、JavaEE支持、容器周期、事件传播等;核心接口是ApplicationContext
  • EL模块:提供强大的表达语言支持,支持访问和修改属性值,方法调用,支持访问及修改数组、容器和索引器,命名变量,支持算数和逻辑运算,支持从Spring容器获取Bean,它也支持列表投影,选择和一般的列表聚合等
  • Test模块:Spring支持Junit和TestNG测试框架,而且还额外提供一些基于Spring的测试功能,如测试Web框架时,模拟Http请求的功能

💫面向切面编程模块(AOP)

面向切面

编程,通过

预编译

方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是

Spring

框架中的一个重要内容,是函数式编程的一种衍生范型。利用

AOP

可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的

耦合度

降低,提高程序的可重用性,同时提高了开发的效率。

OOP:

面向对象

程序设计(Object Oriented Programming)作为一种新方法,其本质是以建立模型体现出来的抽象思维过程和

面向对象

的方法。模型是用来反映现实世界中事物特征的。任何一个模型都不可能反映客观事物的一切具体特征,只能对事物特征和变化规律的一种抽象,且在它所涉及的范围内更普遍、更集中、更深刻地描述客体的特征。通过建立模型而达到的抽象是人们对客体认识的深化。

💫数据访问模块(Data Access/Integration)

通过Spring提供的数据访问模块可以很方便地集成第三方的ORM框架,也可以使用Spring提供的JDBC模块实现数据的持久化

💫Web模块(Web)

Web模块建立在应用程序上下文模块之上,为基于Web的应用程序提供上下文,所以,Spring框架支持与Struts的集成。Web模块简化了处理多部分请求及将请求参数绑定到域对象的工作,并提供MVC的实现,即Spring MVC 这是一个全功能的构建Web应用程序的MVC实现。通过策略接口,MVC框架变为高度可配置的。MVC容纳了大量视图技术,包括JSP、Velocity、iText和POI

💫单元测试模块(Test)

单元测试模块提供了JUnit及TestNG,用于实现对应用的单元测试的集成测试,同时引入mock以实现对Web模块的单元测试

💫思维转变(传统开发—>IOC容器)

  • 传统开发

程序控制对象:如果有多种实现类,需要改变实现类,繁杂,无法适应变更

publicclassUserServiceImplimplementsUserService{private UserDao userDao =newUserDaoImpl();publicvoidgetUser(){
        userDao.getUser();}}
  • IOC容器

set注入,使程序更加灵活,降低耦合性,这就是IOC原型

publicclassUserServiceImplimplementsUserService{private UserDao userDao;//通过构造器函数参数,让容器把创建好的依赖对象注入setUserDao,当然也可以使用setter方法进行注入publicvoidsetUserDao(UserDao userDao){this.userDao = userDao;}@OverridepublicvoidgetUser(){
        userDao.getUser();}}

☢Spring IOC/DI

Spring IOC:控制反转

💨第一个Spring程序

案例:Hello Spring

  • 编写Hello实体类
package com.wei.pojo;publicclassHello{private String name;public String getName(){return name;}publicvoidsetName(String name){this.name = name;}publicvoidshow(){
        System.out.println("Hello"+","+ name);}}
  • 编写Spring文件,命名为beans.xml
<?xml version="1.0" encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--bean就是Java对象,由Spring创建和管理--><beanid="hello"class="com.wei.pojo.Hello"><propertyname="name"value="Spring"/></bean></beans>
  • 编写测试类
import com.wei.pojo.Hello;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;publicclassMyTest{publicstaticvoidmain(String[] args){//解析beans.xml文件,生成管理相应的Bean对象
        ApplicationContext context =newClassPathXmlApplicationContext("beans.xml");//getBean:参数即为Spring配置文件中的bean的id
        Hello hello =(Hello) context.getBean("hello");//强制类型转换
        hello.show();}}

**

总结:

**

  • bean就是Java对象,由Spring创建和管理
<bean id="hello"class="com.wei.pojo.Hello"><property name="name" value="Spring"/></bean>
  • 解析beans.xml文件,生成管理相应的Bean对象
ApplicationContext context =newClassPathXmlApplicationContext("beans.xml");
  • getBean:参数即为Spring配置文件中的bean的id
 Hello hello =(Hello) context.getBean("hello");//强制类型转换

💨Spring配置说明

  • id:bean的唯一标识符,也就是相当于对象名
  • class:bean对象所对应的全限定名:包名.类型
  • name:别名
<beanid="hello"class="com.wei.pojo.Hello"><propertyname="name"value="Spring"/></bean>

💨import

  • import,一般用于团队开发中,可以将多个配置文件导入合并为一个
  • 将所有xml文件导入到applicationContext.xml中,方法如下
<importresource="beans1.xml"/><importresource="beans2.xml"/><importresource="beans3.xml"/>

💨IOC创建对象方式

无参构造(

默认

)

  • 默认使用无参构造创建对象
publicUser(){
        System.out.println("User的无参构造");}
<beanid="user"class="com.wei.pojo.User"><propertyname="name"value="秦疆"/>-->
    </bean><!--
输出:
User的无参构造
name=秦疆
-->

带参构造

  • 第一种方法:下标赋值
publicUser(String name){this.name=name;}
<!--    第一种,下标赋值--><beanid="user"class="com.wei.pojo.User"><constructor-argindex="0"value="wei_shuo"/></bean><!--
输出:
name=wei_shuo
-->
  • 第二种方法:类型创建
publicUser(String name){this.name=name;}
<beanid="user"class="com.wei.pojo.User"><constructor-argtype="java.lang.String"value="秦疆"/></bean>
  • 第三种方法:参数名称
publicUser(String name){this.name=name;}
<beanid="user"class="com.wei.pojo.User"><constructor-argname="name"value="秦疆"/></bean>

💨DI依赖注入

依赖:bean对象的创建依赖于容器

注入:bean对象中的所有属性,容器注入

  • 构造器注入即无参构造/带参构造注入
  • Set注入
//复杂类型publicclassAddress{private String address;public String getAddress(){return address;}publicvoidsetAddress(String address){this.address = address;}@Overridepublic String toString(){return"Address{"+"address='"+ address +'\''+'}';}}
//真实测试对象publicclassStudent{private String name;private Address address;private String[] books;private List<String> hobbys;private Map<String,String> card;private Set<String> game;private String wife;private Properties info;//以及set/get方法  toString实现方法 此处省略}
<beanid="student"class="com.wei.pojo.Student"><!--第一种,普通值注入,使用Value--><propertyname="name"value="秦疆"/></bean>

💫完整注入信息

  • Studnet类
publicclassStudent{private String name;private Address address;private String[] books;private List<String> hobbys;private Map<String,String> card;private Set<String> game;private String wife;private Properties info;//以及set/get方法  toString实现方法 此处省略}
  • Address类
private String address;public String getAddress(){return address;}publicvoidsetAddress(String address){this.address = address;}@Overridepublic String toString(){return"Address{"+"address='"+ address +'\''+'}';}
  • beans.xml配置
<beanid="address"class="com.wei.pojo.Address"><propertyname="address"value="武汉"/></bean><beanid="student"class="com.wei.pojo.Student"><!--第一种,普通值注入,使用Value--><propertyname="name"value="秦疆"/><!--第二种,Bean注入,使用ref--><propertyname="address"ref="address"/><!--数组注入--><propertyname="books"><array><value>红楼梦</value><value>西游记</value><value>水浒传</value><value>三国演义</value></array></property><!--List注入--><propertyname="hobbys"><list><value>听音乐</value><value>看电影</value><value>听书</value></list></property><!--Map注入--><propertyname="card"><map><entrykey="学生编号"value="123"/><entrykey="书籍编号"value="456"/></map></property><!--Set注入--><propertyname="game"><set><value>英雄联盟</value><value>Apex</value></set></property><!--Null注入--><propertyname="wife"><null/></property><!--Properties注入--><propertyname="info"><props><propkey="学号">2000</prop><propkey="性别">男</prop><propkey="姓名">小明</prop></props></property></bean>
  • 测试类
publicclassMyTest{publicstaticvoidmain(String[] args){
        ApplicationContext context =newClassPathXmlApplicationContext("beans.xml");
        Student student =(Student) context.getBean("student");
        System.out.println(student.toString());}}/*
输出结果:
Student{
    name='秦疆', 
    address=Address{address='武汉'}, 
    books=[红楼梦, 西游记, 水浒传, 三国演义], 
    hobbys=[听音乐, 看电影, 听书], 
    card={
        学生编号=123, 
        书籍编号=456
    }, 
    game=[英雄联盟, Apex], wife='null', 
    info={
        学号=2000, 
        性别=男, 
        姓名=小明
        }
}
*/

💨Bean作用域

  • singleton 单实例(单例)(默认)   ----全局有且仅有一个实例
<beanid="user2"class="com.wei.pojo.User"c:name="wei_shuo"c:age="18"scope="singleton"/>
  • prototype 多实例(多例)   ---- 每次获取Bean的时候会有一个新的实例
<bean id="user2"class="com.wei.pojo.User" c:name="wei_shuo" c:age="18" scope="prototype"/>

以下在web开发中使用

  • request
  • session
  • application
  • websocket

💨Bean自动装配(Autowire)

自动装配是Spring满足bean依赖的方式,Spring会在上下文中自动寻找,自动给bean装配属性

  • xml中显示装配
  • Java中显示配置
  • 隐式自动装配bean

案例实现:

  • 一个人(people)有两个宠物(dog/cat)
  • 狗实现方法wang
  • 猫实现方法mioa
  • Dog类
publicclassDog{publicvoidshout(){
        System.out.println("wang");}}
  • Cat类
publicclassCat{publicvoidshout(){
        System.out.println("miao");}}
  • people类
publicclassPeople{private Cat cat;private Dog dog;private String name;/*
    get/set方法 
    toString方法
    需要写,笔者为了不影响文章美观此处省略……
    */}
  • beans.xml - byName:会自动在容器上下文中查找,和自己对象set方法后面的值(dog/cat)对应的beanid,如果beanid满足则自动装配- byType:会自动在容器上下文中查找,和自己对象属性类型相同的bean,如果类型全局唯一满足则自动装配
<!--beanid--><beanid="cat"class="com.wei.pojo.Cat"/><beanid="dog"class="com.wei.pojo.Dog"/><!--
    autowire的属性值
    byName:会自动在容器上下文中查找,和自己对象set方法后面的值(dog/cat)对应的beanid,如果beanid满足则自动装配
    byType:会自动在容器上下文中查找,和自己对象属性类型相同的bean,如果类型全局唯一满足则自动装配
    --><beanid="people"class="com.wei.pojo.People"autowire="byName"><!--autowire="byName"    根据名字自动装配--><!--<bean id="people" class="com.wei.pojo.People" autowire="byType">    autowire="byType 根据对象属性类型自动装配--><propertyname="name"value="wei_shuo"/><!--如下--><!--<property name="dog" ref="dog"/>--><!--<property name="cat" ref="cat"/>--></bean>

💨Spring框架xml配置中属性 ref 与 value的区别

  • 属性 ref :对象引用类型,代表引用这个对象
  • 属性 value:字符串引用类型,代表引入的这个对象名字的字符串

🌼 结语:创作不易,如果觉得博主的文章赏心悦目,还请——

点赞

👍

收藏

⭐️

评论

📝

冲冲冲

🤞

在这里插入图片描述

标签: spring java bean

本文转载自: https://blog.csdn.net/weixin_62765017/article/details/127356408
版权归原作者 wei_shuo 所有, 如有侵权,请联系我们删除。

“Spring框架原理 | IOC/DI | Bean”的评论:

还没有评论