Spring学习笔记(一)基础介绍

spring概述

Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架。它是为了解决企业应用开发的复杂性而创建的。
框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。Spring 使用基本的 JavaBean来完成以前只可能由 EJB 完成的事情。然而,Spring 的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何 Java 应用都可以从 Spring 中受益。Spring 的核心是控制反转(IoC)和面向切面(AOP)。
简单来说,Spring 是一个分层的 JavaSE/EE full-stack(一站式) 轻量级开源框架。

spring优点

1.方便解耦,简化开发
Spring 就是一个大工厂,可以将所有对象创建和依赖关系维护,交给 Spring 管理
2.AOP 编程的支持
Spring 提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能
3.声明式事务的支持
只需要通过配置就可以完成对事务的管理,而无需手动编程
4.方便程序的测试
Spring 对 Junit4 支持,可以通过注解方便的测试 Spring 程序
5.方便集成各种优秀框架
Spring 不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz 等)的直接支持
6.降低 JavaEE API 的使用难度
Spring 对 JavaEE 开发中非常难用的一些 API(JDBC、JavaMail、远程调用等),都提供了封装,使这些 API 应用难度大大降低

spring反转控制IOC和依赖注入DI

IOC:inverse of control由程序来创建对象,对象的创建权反转(交给)给 Spring.作用是实现了程序的解耦合,工厂模式可以实现接口和实现类的解耦合
DI :Dependency Injection 依赖注入.需要有 IOC 的环境,Spring 创建这个类的过程中,Spring 将类的依
赖的属性设置进去.
在这里插入图片描述

反射+配置文件+工厂
<bean id="userDao" class="cn.itcast.dao.UserDaoImpl">
BeanFactory{
	public static Object getBean(String id)
	{
		class clazz=class.forName();
		return clazz.newInstance();
	}
}
UserDao userDao=BeanFactory.getBean("userDao");

Spring的模块介绍

在这里插入图片描述
Spring框架分为四大模块:
Core核心模块。负责管理组件的Bean对象

spring-beans-4.0.0.RELEASE.jar

spring-context-4.0.0.RELEASE.jar

spring-core-4.0.0.RELEASE.jar

spring-expression-4.0.0.RELEASE.jar

面向切面编程

spring-aop-4.0.0.RELEASE.jar

spring-aspects-4.0.0.RELEASE.jar

数据库操作

spring-jdbc-4.0.0.RELEASE.jar

spring-orm-4.0.0.RELEASE.jar

spring-oxm-4.0.0.RELEASE.jar

spring-tx-4.0.0.RELEASE.jar

spring-jms-4.0.0.RELEASE.jar

Web模块

spring-web-4.0.0.RELEASE.jar

spring-webmvc-4.0.0.RELEASE.jar

spring-websocket-4.0.0.RELEASE.jar

spring-webmvc-portlet-4.0.0.RELEASE.jar

相关配置

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans 		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
			xmlns="http://www.springframework.org/schema/beans" 
			xsi:schemaLocation="http://www.springframework.org/schema/beans 
			http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">

	<!-- 将User对象交给spring容器管理 -->
	<!-- Bean元素:使用元素描述需要spring容器管理的对象
				name属性:给被管理的对象起个名字,获得对象时根据该名称获得对象		
						可以重复,可以特殊字符
				class属性:被管理对象的完整类名
				id属性:与name属性一模一样,名称不可重复,不能使用特殊字符
				结论:尽量使用name属性
	-->
	<bean name="user" class="cn.itcast.bean.User"></bean>
	<import resource="cn/itcast/b_create/applicationContext.xml"/>
</beans>

取出user

	public void fun1() {
		//1.创建容器对象
		ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
		//2.向容器要User对象
		User u=(User) ac.getBean("user");
		//3.打印User对象
		System.out.println(u);
	}

spring中的工厂(容器)

1.BeanFactory

在这里插入图片描述

2.ApplicationContext

ApplicatioContext 接口有两个实现类:
在这里插入图片描述
ClassPathXmlApplicationContext :加载类路径下 Spring 的配置文件.
FileSystemXmlApplicationContext :加载本地磁盘下 Spring 的配置文件

3.两者的而区别:beanfactory和applicationcontext

BeanFactory :是在 getBean 的时候才会生成类的实例.
ApplicationContext :在加载 applicationContext.xml(容器启动)时候就会创建

spring配置详情

1.bean的属性
1.1id 属性和 name 属性标签的配置

id :Bean 起个名字. 在约束中采用 ID 的约束:唯一.必须以字母开始,可以使用字母、数字、连字符、
下划线、句话、冒号 id:不能出现特殊字符.

<bean id=”bookAction”>

name:Bean 起个名字. 没有采用 ID 的约束. name:出现特殊字符.如果没有 id 的话 , name 可
以当做 id 使用.
整合 struts1 的时候:

<bean name=/loginAction” >
1.2scope 属性:Bean 的作用范围
* singleton :默认值,单例的.
* prototype :多例的.
* request :WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 request 域中.
* session :WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 session 域中.
* globalSession :WEB 项目中,应用在 Porlet 环境.如果没有 Porlet 环境那么 globalSession 相当
于 session.

一般只用前两种:singleton和prototype

1.3Bean 的生命周期的配置

通过配置标签上的 init-method 作为 Bean 的初始化的时候执行的方法,配置 destroy-method
作为 Bean 的销毁的时候执行的方法。
销毁方法想要执行,需要是单例创建的 Bean 而且在工厂关闭的时候,Bean 才会被销毁.

	<bean 	name="user" class="cn.itcast.bean.User" 
			scope="singleton" 
			init-method="init"
			destroy-method="destroy" >
	</bean>
2.spring对Bean的管理XML
2.1spring生成Bean的三种方式
创建方式1:空参构造对象
package cn.itcast.bean;
public class User {
	public User()
 {System.out.println("User对象空参构造方法!!!!");}
	private String name;
	private Integer age;
	public String getName() {return name;}
	public void setName(String name) {this.name = name;}
	public Integer getAge() {return age;}
	public void setAge(Integer age) {this.age = age;}
	public void init(){System.out.println("我是初始化方法!");}
	public void destroy(){System.out.println("我是销毁方法!");}
	@Override
	public String toString() {
		return "User [name=" + name + ", age=" + age + ", car=" + car + "]";
	}
}
<bean 	name="user" 
		class="cn.itcast.bean.User" 
		scope="singleton" 
		init-method="init"
		destroy-method="destroy"
		>
</bean>
创建方式2:静态工厂创建

调用UserFactory的createUser方法创建名为user2的对象,放入容器中

package cn.itcast.b_create;
import cn.itcast.bean.User;
public class UserFactory {
	public static User createUser(){
		System.out.println("静态工厂创建");
		return new User();
	}
}
<bean 	name="user2" 
		class="cn.itcast.b_create.UserFactory" 
		factory-method="createUser">
</bean>
创建方式3:实例工厂创建

调用UserFactory的createUser2方法创建名为user3的对象,放入容器中

package cn.itcast.b_create;
import cn.itcast.bean.User;
public class UserFactory {
	public User createUser2(){
		System.out.println("实例工厂创建");
		return new User();
	}
}
<bean 	name="user3" 
		factory-bean="userFactory"
		factory-method="createUser2">
</bean>
<bean 	name="userFactory" 
		class="cn.itcast.b_create.UserFactory" >
</bean>
2.2 Spring 的 Bean 的属性注入

【构造方法的方式注入属性】

	<!-- 构造函数注入 -->
	<bean name="user2" class="cn.itcast.bean.User">
		<constructor-arg name="name" value="999" index="0" type="java.lang.Integer"></constructor-arg>
		<constructor-arg name="car" ref="car" index="1"></constructor-arg>
	</bean>

【set 方法的方式注入属性】

	<!-- set方法注入 -->
	<bean name="user" class="cn.itcast.bean.User">
		<!-- 值类型注入 -->
		<property name="age" value="18"></property>
		<property name="name" value="tom"></property>
		<!-- 引用类型注入:为了car属性注入下方的car对象 -->
		<property name="car" ref="car"></property>
	</bean>
	<!-- 将car配置到容器中 -->
	<bean name="car" class="cn.itcast.bean.Car">
		<property name="name" value="Rolls-Royce"></property>
		<property name="color" value="白色"></property>
	</bean>

【名称空间 p 的属性注入的方式:Spring2.x 版本后提供的方式】

<!-- p名称空间注入, 走set方法
	1.导入P名称空间  xmlns:p="http://www.springframework.org/schema/p"
	2.使用p:属性完成注入
		|-值类型: p:属性名="值"
		|-对象类型: p:属性名-ref="bean名称"
 -->
	<bean name="user3" class="cn.itcast.bean.User" p:name="jack" p:age="20" p:car-ref="car">
	</bean>

【spel:spring el表达式】

<!-- 
	spel注入: spring Expression Language spring表达式语言
 -->
<bean  name="user4" class="cn.itcast.bean.User" >
		<property name="name" value="#{user.name}" ></property>
		<property name="age" value="#{user3.age}" ></property>
		<property name="car" ref="car" ></property>
</bean>

【复杂类型注入】

package cn.itcast.c_injection;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Properties;
public class CollectionBean {
	private Object[] arr;//数组类型注入
	private List list;//list/set 类型注入
	private Map map;//map类型注入
	private Properties prop;//properties类型注入
	public Object[] getArr() {return arr;}
	public void setArr(Object[] arr) {this.arr = arr;}
	public List getList() {return list;}
	public void setList(List list) {this.list = list;}
	public Map getMap() {return map;}
	public void setMap(Map map) {this.map = map;}
	public Properties getProp() {return prop;}
	public void setProp(Properties prop) {this.prop = prop;}
	@Override
	public String toString() {
		return "CollectionBean [arr=" + Arrays.toString(arr) + ", list=" + list + ", map=" + map + ", prop=" + prop
				+ "]";
	}
}
<bean name="cb" class="cn.itcast.c_injection.CollectionBean" >
	<!-- 如果数组中只准备注入一个值(对象),直接使用value|ref即可 
	<property name="arr" value="tom" ></property>
	-->
	<!-- array注入,多个元素注入 -->
	<property name="arr">
		<array>
			<value>tom</value>
			<value>jerry</value>
			<ref bean="user4" />
		</array>
	</property>
	
	<!-- 如果List中只准备注入一个值(对象),直接使用value|ref即可 
	<property name="list" value="jack" ></property>-->
	<property name="list"  >
		<list>
			<value>jack</value>
			<value>rose</value>
			<ref bean="user3" />
		</list>
	</property>
	
	<!-- map类型注入 -->
	<property name="map"  >
		<map>
			<entry key="url" value="jdbc:mysql:///crm" ></entry>
			<entry key="user" value-ref="user4"  ></entry>
			<entry key-ref="user3" value-ref="user2"  ></entry>
		</map> 
	</property>
	
	<!-- prperties 类型注入 -->
	<property name="prop"  >
		<props>
			<prop key="driverClass">com.jdbc.mysql.Driver</prop>
			<prop key="userName">root</prop>
			<prop key="password">1234</prop>
		</props>
	</property>
</bean>
Spring 的分配置文件的开发

一种:创建工厂的时候加载多个配置文件

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml","applicationContext2.xml");

二种:在一个配置文件中包含另一个配置文件

<import resource="applicationContext2.xml"></import>
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值