Spring框架Bean大致内容
程序员文章站
2022-07-12 12:57:34
...
Spring框架
Spring简介
Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式)轻量级开源框架。贯穿表现层,业务层,持久层,但是spring并不是取代那些已有框架,而是与他们无缝结合。
常见英文单词
Spring core : Spring核心容器
<beans></beans>:配置文件根标签
<bean></bean>:每个对象对应一个bean标签 id="不可重复,标示符" class="对应实体类完整的包名.类名"
<property></property>:为对象的属性赋值 name="属性名" value="属性值" ref="引用对象id"
ApplicationContext:IOC容器对象,用来保存从xml中读取的对象
ClassPathXmlApplicationContext(".xml相对路径"):
IOC:控制反转核心,控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。从之前在代码中主动new对象,反转到由xml中进行配置,然后通过spring提供的ioc容器读取xml然后反射生成对象。
DI:依赖注入,在ioc生成对象的时候,通过对象提前写好的一些set方法,通过调用这些set方法设置一些数值。这个动作就叫做注入。
BeanFactory:IOC容器的基本实现,是Spring内部的基础设施,是面向Spring本身的,不是提供给开发人员使用的。
Bean的作用域
Singleton:单例,获取Singleton对象都是同一个对象,初始化IOC容器即创建该对象,但可以
配置lazy-init="true"来延迟初始化bean,这时候,只有第一次获取bean才会初始化bean,即第一次请求该bean时才初始化。
prototype:Prototype作用域的bean会导致在每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean() 方法)时都会创建一个新的bean实例 。
request:表示该针对每一次HTTP请求都会产生一个新的bean,仅适用于WebApplicationContext环境。
<bean id="bean的id" class="bean的包名.类名" scope="request"/>
Spring1以上提供
session:表示该针对每一次会话都会产生一个新的bean,仅适用于WebApplicationContext环境。
<bean id="bean的id" class="bean的包名.类名" scope="session"/>
Spring1以上提供
Bean的生命周期
什么时候初始化bean实例?
当scope=singleton,即默认情况,会在容器初始化时实例化。但我们可以指定Bean节点的lazy-init=”true”来延迟初始化bean,这时候,只有第一次获取bean才会初始化bean,即第一次请求该bean时才初始化。
如果想对所有bean都应用延迟初始化,可以在根节点beans设置default-lazy-init=”true”
当scope=prototype时,也会延迟初始化bean,即第一次请求该bean时才初始化(如调用getBean()方法时).
Spring IOC容器对bean的生命周期进行管理的过程:
[1]通过构造器或工厂方法创建bean实例
[2]为bean的属性设置值和对其他bean的引用
[3]调用bean的初始化方法 ? (我们可以为一个普通的java对象指定初始化方法)
[4]bean可以使用了
[5]当容器关闭时,调用bean的销毁方法
在配置bean时,通过init-method和destroy-method属性为bean指定初始化和销毁方法
<bean id="" class="" init-method="对应类中初始化方法函数名" destroy-method="...."></bean>
Bean在applicatonContext.xml中的配置方式,在Java代码中通过
ApplicationContext app = new ClassPathXmlApplicationContext("配置文件相对路径");
app.getBean("配置中对应的id")
<?xml version="1.0" encoding="UTF-8"?>
<!-- beans中以default开头的属性为当前所有bean对象配置统一的默认属性 -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd"
default-init-method="init" default-destroy-method="destory"
default-lazy-init="true">
<!-- 我们的目的是使用spring帮助我们创建一个student对象,而不是主动new的方式 -->
<!-- 如果我们想要让spring创建一个对象,我们需要把对象以bean标签的形式声明在spring的配置文件中 -->
<!-- id为自定义的唯一标签字符串,class是想要由spring创建的类的包名类名 -->
<!-- scope表示一个bean对象的作用域,默认或者值为sigleton的时候为单例的,prototype表示多例,也就是每次获取id对应的bean都会创建一个新的对象 -->
<!-- init-method指向class属性的类中的某一个方法,表示ioc容器在初始化此bean对象的时候会调用对应方法 -->
<!-- lazy-init="true" 表示此bean的创建是一个延迟的,即使是一个单例的bean,也不会再容器初始化之后立即初始化,而是什么时候获取它才会调用 -->
<bean id="stu1" class="com.qfedu.pojo.Teacher" scope="singleton"
lazy-init="true" destroy-method="destory" init-method="init">
<!-- 创建类的同时为属性挨个进行赋值 -->
<!-- 一个 property表示一个属性name指向实体类属性名 -->
<!-- property标签其实最终影响DI以set方法的方式进行数据的注入 -->
<property name="id" value="1000"></property>
<property name="name" value="pfdu"></property>
<property name="age" value="18"></property>
</bean>
<bean id="stu2" class="com.qfedu.pojo.Person">
<!-- constructor-arg表示依赖注入会采用构造进行赋值 -->
<!-- index="1" 允许开发者通过参数下标为构造中的参数赋值 -->
<!-- name允许开发者指定属性的名称进行赋值,在使用构造赋值中是最常用的方式 -->
<constructor-arg value="30000" name="id"></constructor-arg>
<constructor-arg value="pfdu2" name="name"></constructor-arg>
<constructor-arg value="40" name="age"></constructor-arg>
</bean>
<!-- p命名空间的方式进行赋值,本质其实还是通过set方法赋值 ,可以理解为使用property标签的另一种写法 -->
<bean id="stu3" class="com.qfedu.pojo.Student" p:id="800" p:name="nihao"
p:age="30">
</bean>
<!-- 引用外部bean -->
<bean id="add" class="com.qfedu.pojo.Address" p:city="开封"
p:detail="天波杨府"></bean>
<bean id="stu4" class="com.qfedu.pojo.Student">
<property name="id" value="222"></property>
<property name="age" value="30"></property>
<property name="name" value="穆桂英"></property>
<!-- 如果某一个属性是一个对象,那么需要首先将包含的对象也声明成一个bean,然后通过ref指向他的id -->
<property name="address" ref="add"></property>
<!-- 级联属性操作,运行调用属性下一层级的属性为其赋值,如果属性本身有值,会修改 -->
<property name="address.city" value="大梁"></property>
</bean>
<!-- 内部bean -->
<bean id="stu5" class="com.qfedu.pojo.Student">
<property name="id" value="22"></property>
<property name="name" value="张飞"></property>
<property name="age" value="22"></property>
<property name="address">
<!-- 内部bean -->
<!-- 内部bean不能有id,因他不能被其他地方引用 -->
<bean class="com.qfedu.pojo.Address">
<property name="city" value="涿州"></property>
<property name="detail" value="菜市场"></property>
</bean>
</property>
</bean>
<bean id="stu6" class="com.qfedu.pojo.Student">
<property name="favs">
<list>
<value>跑步</value>
<value>游泳</value>
<value>射击</value>
</list>
</property>
<property name="map">
<map>
<entry key="key1" value="value1"></entry>
<entry key="key2" value-ref="add"></entry>
</map>
</property>
</bean>
<!-- spel。语法类似于el语句,是书写在spring的配置文件中的一种动态语法,是对当前xml配置的补充,并不一定是必须 -->
<bean id="stu7" class="com.qfedu.pojo.Student">
<!-- spel,可以用于引用外部bean 大括号中就是另外一个bean的id -->
<property name="address" value="#{add}"></property>
<!-- spel还支持操作对象图,通过对象.属性进行下一层级调用 -->
<property name="name" value="#{add.city}"></property>
</bean>
<bean id="stu8" class="com.qfedu.pojo.Student">
<!-- 获取另外一个bean中的方法的返回值为当前属性赋值,也允许传参 -->
<property name="name" value="#{stu7.type()}"></property>
<property name="id" value="#{T(java.lang.Math).PI*3}"></property>
</bean>
</beans>
SPEL
简介:Spring Expression Language,Spring表达式语言,简称SpEL。支持运行时查询并可以操作对象图。
基本语法
SpEL使用#{…}作为定界符,所有在大框号中的字符都将被认为是SpEL表达式 。
spel使用在applicationContext.xml中
Spel的用法
1,引用其他bean
2,引用其他bean的属性值作为自己某个属性的值
3,调用非静态方法
4,调用静态方法
5,运算符
如下图所示
1,引用其他bean
2,引用其他bean的属性值作为自己某个属性的
3,调用非静态方法
4,调用静态方法
5,运算符
①算术运算符:+、-、*、/、%、^
②字符串连接:+
③比较运算符:<、>、==、<=、>=、lt、gt、eq、le、ge
④逻辑运算符:and, or, not, |
⑤三目运算符:判断条件?判断结果为true时的取值:判断结果为false时的取值
⑥正则表达式:matches
刚开始学习,逐渐完善中
上一篇: 学习Spring中的Bean
推荐阅读
-
Spring 框架基础(02):Bean的生命周期,作用域,装配总结
-
Spring框架Bean大致内容
-
Spring框架中Bean的生命周期
-
[ SSH框架 ] Spring框架学习之二(Bean的管理和AOP思想)
-
现有web系统替换成Spring Boot2框架 之20 启动报错处理 spring boot启动报错@SpringBootApplicationUnable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean
-
现有web系统替换成Spring Boot2框架 之20 启动报错处理 spring boot启动报错@SpringBootApplicationUnable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean
-
Spring整合MyBatis框架时报错解决Error creating bean with name ‘xxx‘: Unsatisfied dependency expressed...
-
学Java,不懂Spring框架?还不快快戳进来!(一步步带你创建属于你自己的Spring程序)属性注入,Spring的配置,bean作用域。放心,小白也能看的懂啦~
-
Spring 框架基础(02):Bean的生命周期,作用域,装配总结
-
Spring框架_实例化Bean的三种方式