Spring框架Bean大致内容

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

 

 

刚开始学习,逐渐完善中

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值