Spring框架基础

1.JavaBean:

符合一定规范的(结构雷同)的简单Java对象,有时候也称为POJO对象。必须有包(package),必须有无参数构造器(方便子类的继承和创建,方便利用无参数构造器创建对象),实现序列化接口(方便底层自动调用对象的序列化功能),属性有get和set访问方法(get set 方法声明的属性称为“Bean属性”, 类中声明的实例变量称为“对象属性”)。


2.Spring核心功能:

Spring 内部提供了一个JavaBean对象容器(集合)由于创建和管理对象。需要提供配置文件(xml文件),Spring根据配置文件创建和管理对象。

3.使用Spring:

1)导入Spring框架API

                <dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>4.3.10.RELEASE</version>
		</dependency>

2)创建一个符合要求JavaBean

3)创建一个XML文件,告诉Spring创建哪些对象

    <bean id="obj1" class="day01.HelloWorld"/></beans>

4)启动Spring容器,Spring会根据XML文件创建对象

                ClassPathXmlApplicationContext ctx;
		@Before //在测试案例之前执行
		public void initCtx() {
			//初始化Spring容器, 需要提供配置文件,默认位置为 resources
			ctx =new ClassPathXmlApplicationContext("applicationContext.xml");
		}
		@After //在测试案例之后执行
		public void destroy() {
			ctx.close(); //关闭Spring容器,会销毁Bean对象
		}

5. 从Spring获得创建对象

        @Test
		public void testHelloWorld() {
			//Spring中就已经创建了 HelloWorld对象,利用ID获取Spring中创建的对象
			HelloWorld obj=(HelloWorld)ctx.getBean("obj1");
			//检查是否成功创建了对象
			System.out.println(obj); 
		}

4.Spring 容器

Spring 核心功能是管理JavaBean对象,由于其内部缓存了JavaBean对象,所以称为为 JavaBean 容器。

Spring可以创建JavaBean对象,也称为BeanFactory(JavaBean的工厂),后来Spring在BeanFactory基础上扩展了接口 ApplicationContext,常用实现类是 ClassPathXmlApplicationContext。
           ClassPathXmlApplicationContext 是Spring容器、Bean容器也是Bean工厂。

5.Spring 容器功能使用

1)Spring 配置文件用于声明JavaBean对象

<bean id="obj1" class="day01.HelloWorld"/>

2)Spring配置文件中 id 属性和name属性功能一样常用的属性是id

<!-- id 属性和 name属性作用一样 -->
		<bean name="obj2" class="day01.HelloWorld"/>

3)Spring容器提供了多个获取Bean对象的方法:

    //返回是Object类型需要进行类型转换
    Object bean = ctx.getBean("BeanID")
    //返回具体类型的Bean对象		
    类型 obj = ctx.getBean("BeanID", 类型)

案例:

 
	<!-- 利用配置文件,告诉Spring管理哪些JavaBean对象 -->
	<bean id="obj1" class="day01.HelloWorld"/>
	<!-- id 属性和 name属性作用一样 -->
	<bean name="obj2" class="day01.HelloWorld"/>
	@Test
	public void testName() {
		//利用name属性获取Spring容器中的对象
		HelloWorld obj=(HelloWorld)ctx.getBean("obj2");
		//检查是否成功创建了对象
		System.out.println(obj); 
	}
	@Test
	public void testGetBean() {
		//Spring容器提供了多个获取Bean对象的方法:
		HelloWorld bean1 = (HelloWorld)ctx.getBean("obj1");
		System.out.println(bean1);
		//返回具体类型的方法,无需类型转换(常用)
		HelloWorld bean2 = ctx.getBean("obj1", HelloWorld.class);
		System.out.println(bean2); 
	}

6.Spring 创建对象的方式

1)利用无参数构造器创建对象
        默认情况下,Spring会自动调用(反射调用)无参数构造器创建对象。
2)利用静态工厂方法创建对象, Spring可以利用工厂方法来创建对象
        “工厂方法” 创建对象方法称为工厂方法。

//配置文件:
<!-- Spring利用静态工厂方法创建对象 -->
<bean id="cal1" class="java.util.Calendar" factory-method="getInstance"/> 
//测试案例:
@Test 
public void testCalendar() {
	//静态方法getInstance(),来创建Calendar对象,创建对象的静态方法称为,静态工厂方法。
	//Calendar cal = Calendar.getInstance();
	//Spring支持静态工厂方法,调用静态工厂方法将创建的对象放到Spring容器管理,提供给外部使用。
	Calendar cal1 = ctx.getBean("cal1", Calendar.class);
	System.out.println(cal1); 
}

3. 利用对象工厂方法创建对象
        利用对象提供的工厂方法创建另外一个对象。

    <!-- 利用Bean对象cal1提的工厂方法创建对象 -->
		<bean id="date1" factory-bean="cal1"factory-method="getTime"/>
		@Test
		public void testFactoryBean() {
			//测试利用Spring调用Bean对象的工厂方法创建对象
			Date date = ctx.getBean("date1", Date.class);
			System.out.println(date); 
		}

7.单例与多例

单例的特点:

1. 资源占用少, 一个对象可以被复用。
2. 并发访问时候,单例对象的属性可能出现并发访问问题。

多个实例:
1. 每个实例都有一组数据,资源占用高,可以保持多个状态
2. 如果每个线程访问一个实例,就没有线程并发安全问题

> Spring默认情况下按照单例管理对象!

<!-- scope="prototype" 属性设置后,obj3是多例的,每次getBean都会创建一个新对象-->
	<bean id="obj3" class="day01.HelloWorld" scope="prototype"/>

8.对象的生命周期管理

Spring支持对象的生命周期管理方法。生命周期管理方法用于初始化,或者回收资源。

1.默认情况下是单例对象,Spring利用属性调用初始化和销毁方法

<!-- 测试对象生命周期管理方法 -->
		<bean id="demo"	class="day01.DemoBean" init-method="init" destroy-method="destroy"/>

> 关闭容器时候调用 销毁方法。
    > 容器启动时候创建对象调用其初始化方法

2.多例对象时候,Spring只在创建对象时候调用init方法。 不会调用销毁方法

<!-- 测试对象生命周期管理方法 -->
		<bean id="demo"	class="day01.DemoBean"  scopt="prototype"
			init-method="init"  destroy-method="destroy"/>

getBean时候,创建对象并且调用init方法。如果需要执行销毁方法,只能手动执行。

9.懒惰实例化JavaBean

在第一次请求getBean时候实例化对象。按需实例化 lazy-init="true"。

1. 默认情况下Spring对于单例对象,容器启动时候立即实例化。优点是在使用对象时候,对象已经实例化,可以减少延迟,提高性能。 会占用系统资源。
2. lazy-init="true" 属性,以后按需实例化,资源占用低,获取对象慢。
3. 对于一定使用的对象,建议采用立即实例化规则
4. 对于使用少的对象建议采用懒惰实例化
5. Spring默认规则是 立即实例化

案例:

<!-- 测试对象生命周期管理方法 -->
	<bean id="demo"	class="day01.DemoBean" lazy-init="true" 
        init-method="init" destroy-method="destroy"/>

 

10.IOC/DI

控制反转 IOC:由Spring创建对象称为控制反转。

依赖注入DI:由Spring帮助建立对象的依赖关系。

DI 的优势:解耦,将软件组件从紧耦合转换为松耦合关系。

在Spring配置文件中利用 IOC/DI 解决依赖关系:

		<bean id="axe" class="day02.Axe"/>	
		<bean id="saw" class="day02.Saw"/>
		<bean id="qiang" class="day02.Worker">
			<!-- 依赖注入DI:由Spring帮助建立对象的依赖关系 -->
			<!-- spring会自动调用 setTool 方法注入 axe 引用 -->
			<property name="tool" ref="saw"/> 
		</bean>

 

11.构造器参数注入

Spring支持 利用 构造器创建对象:constructor-arg 子元素,其中index="0"用于指定参数在构造器参数的位置。

配置:

                <bean id="xiong" class="day02.Worker" lazy-init="true">
			<!-- 构造器参数注入,也就是调用有参数构造器创建对象 -->
			<constructor-arg index="0" value="熊大"/>
			<property name="tool" ref="saw"/> 
		</bean>

12.按照名字自动注入

Spring支持自动按照名字注入功能,Spring会自动检查Bean属性和Bean ID的匹配,如果匹配上就自动完成注入。

优点:自动注入可以减少XML文件的编写量。

编写配置文件:

                <bean id="tool" class="day02.Axe" lazy-init="true"/>
		<!-- autowired="byName" 自动按Bean属性名字和id的名字进行自动注入:
                bean属性叫tool匹配ID tool称为按照名字自动装配  autowire="byName"-->
		<bean id="tom" class="day02.Worker"  autowired="byName"/>

13.按照类型自动注入

为了实现按照类型注入,需要利于新的配置文件完成测试:

1. 编写 applicationContext1.xml

                <!-- 测试  autowire="byType" 按照类型自动装配,解决对象的依赖关系 -->
		<bean class="day02.Axe"/>	
		<bean id="tom" class="day02.Worker"  autowired="byType"/>

14.Spring基本值注入

Spring支持为Bean注入基本类型参数, 这里的基本类型包括:8个基本类,8个包装类型,String类型。Spring注入基本值时候也是调用的“Bean属性”方法实现的。

1. 配置 :

<!-- 测试基本值的注入 基本值包含:8个基本类,8个包装类型,String类型 -->
		<bean id="andy" class="day02.Worker" lazy-init="true">
			<!-- 注入 JavaBean 对象,使用ref属性 -->
			<property name="tool" ref="axe"></property>
			<!-- 注解基本值,使用value属性 -->
			<property name="name" value="熊二"></property>
			<property name="age" value="10"></property>
		</bean>

15.Spring 表达式

Spring表达式的语法与EL表达式类似:

1. EL表达式: ${}  Spring表达式: #{}
2. Spring表达式也可以读取
    - Bean属性: #{qiang.name}  #{qiang['name']}
    - 数组元素: #{arr[0]}
    - List元素: #{list[1]}
    - Map(Properties)元素: #{jdbc.username} #{jdbc['username']} 
3. 在Spring文件中,可以利用Spring表达式,将一个Bean对象的属性,赋值给另外一个Bean。 
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值