欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

Spring框架Bean大致内容

2,引用其他bean的属性值作为自己某个属性的

Spring框架Bean大致内容

3,调用非静态方法

Spring框架Bean大致内容

4,调用静态方法

Spring框架Bean大致内容

5,运算符

①算术运算符:+、-、*、/、%、^

②字符串连接:+

③比较运算符:<、>、==、<=、>=、lt、gt、eq、le、ge

④逻辑运算符:and, or, not, |

⑤三目运算符:判断条件?判断结果为true时的取值:判断结果为false时的取值

⑥正则表达式:matches

 

 

刚开始学习,逐渐完善中