1.
什么是spring?
· 开源、轻量级、一站式框架
· 两个核心:AOP和IOC
2. 为什么说Spring式一站式框架?
因为spring在javaEE三层结构中,每一层都提供不同的解决技术
web层:springMVC
service层: spring的IOC
dao层: spring的jdbcTemplete
3. IOC的底层原理?如何实现?
IOC实现用到四种技术:
xml配置文件,dom4j解析,工厂设计模式和反射。
步骤分析:
① 第一步,创建xml配置文件,配置要创建的对象类
<bean id="userService" class="cn.godce.UserService"/>
② 第二步,创建工厂类,使用dom4j解析配置文件+反射
public class UserFactory{
public static UserService getService(){
//1. 使用dom4j解析xml文件
//根据id值userService,得到id值对应的class属性值
String className="class属性值";
//2. 使用反射创建类的对象
Class clazz=Class.forName(classValue);
UserService service=clazz.newInstance();
return service;
}
③ 第三步,UserFactory.getUserService();
只用改变配置文件就可以完成程序修改了
这三步对应的spring代码就是:
ApplicationContext context=
new ClassPathXmlApplicationContext("applicationContext.xml");
Xxx obj = (Xxx)context.getBean("id");//xml配置的id
obj.method();
4. Spring核心jar包有几个?
四个,
core(核心),context(全文),bens(IOC),expression(表达式)
再搭两个日志jar包:
5. Spring的Bean管理 是什么?
就是Spring执行IOC操作(Bean的实例化;Bean标签常用属性;Bean属性注入)。
Spring的Bean管理方式有两种:ioc的配置文件方式;ioc的注解方式。
下面先介绍 配置文件方式的Bean管理:
· Bean的实例化方式:
第一种:实用类的无参构造创建(常用)
<bean id="b1" class="xx.xx.X"></bean>
默认找你无参构造,如果xx.xx.X没有无参构造器,报错
原理就是 反射 调用clazz.newInstance()方法
第二种:使用静态工厂创建
创建静态方法 ,返回类对象
<bean id="b2" class="x.xx.B2Factory" factory-method="getBean2"></bean>
第三种:使用实例工厂创建
创建非静态方法,返回类对象
<bean id="b3Factory" class="x.xx.B3Factory"></bean>
<bean id="b3" factory-bean="b3Factory" factory-method="getBean3"></bean>
· Bean标签常用属性
id属性 : 不能包含特殊符号
name属性: 功能和id属性一样,但name属性可以包含特殊符号(_$#...)为什么出现name呢?是历史遗留问题,struts1框架的时候很多id都有特殊符号,这个时候id不能用,就用name标签了。
scope属性: 多个属性值
*singleton:单例 (默认就是 singleton)
*prototype :多例
*request :WEB项目中,Spring创建一个Bean对象,将对象存入到request域中
*session : 存到session域中
*globalSession: WEB项目中,应用在Porlet环境,如果没有此环境相当于session。
测试:
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
User user1 = (User)context.getBean("user");
User user2 = (User)context.getBean("user");
syso(user1);
syso(user2);
//如果是 singleton,则 打印的结果一样,说明是同一个对象
· Bean 属性注入
一个类的属性注入有三种方式:
① setter(常用)
② 有参构造器
③ 接口 setter
在spring框架里面,支持前两种方式
① set方法注入
<bean id="demo" class="x.xx.Demo">
<property name="username" value="zsc"></property>
</bean>
② 有参构造器
<bean id="demo" class="x.xx.Demo">
<constructor-arg name="username" value="zsc"></co.>
</bean>
P名称空间注入
xml:p="http://www.springframework.org/schema/p"
<bean id="person" class="x.xx.Person" p:pname="lucy"></bean>
复杂数据 注入:
<bean id="person" class="x.xx.Person" p:pname="lucy">
<!--数组-->
<property name="arrs">
<list>
<value>1</value>
<value>2</value>
</list>
</property>
<!--list-->
<property name="list">
同上
</property>
<!--map-->
<property name="map">
<map>
<entry key="" value=""></entry>
</map>
</property>
<!--properties-->
<property name="map">
<props>
<prop key="driverclass">com.gg.jdbc.Driver</prop>
</props>
</property>
</bean>
6.IOC和DI有什么区别?
从上面可以看出,DI就是属性注入,IOC就是Bean实例创建,所以DI是建立在IOC基础之上的。
7.Spring整合web项目(Struts/hibernate...)原理
原理就是IOC啊,通过加载spring核心配置文件得到ApplicationContext对象实例,然后IOC获取各个层的对象。
加载spring核心配置文件效率很低,如何优化?
把加载配置文件和创建applicationContext对象过程,在服务器启动时完成(把压力全给到服务器),
用到的技术:
· ServletContext 对象
在服务器启动的时候,每个项目都会产生一个唯一的对象:ServletContext
· 监听器
ServletContext创建通过监听器可以知道。
实现原理:
-在服务器启动的时候,为每个项目创建一个ServletContext对象
-在ServeltContext对象创建时,使用监听器可以监听到ServeltContext对象在什么时候创建,监听到时加载spring配置文件
-把创建出来的配置文件对象放到ServletContext域对象里面(setter)
-获取对象时候,从ServletContext域得到(getter)
· 示例 (web.xml)
<!-- 配置监听器 spring封装了一个监听器,我们只需配置就好了-->
<!--注意 这个监听器 在 spring-web-x.x.x.jar 包中-->
<listener>
<listener-class>ContextLoaderListener</listener-class>
</listener>
<!--ContextLoaderListener默认会去加载 /WEB-INF/applicationContext.xml-->
<!--所以如果你的配置文件不是默认的,还需要配置参数-->
<!--指定spring 配置文件位置-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-config.xml</param-value>
(2)注解管理实例 --配置文件
需要引入 新的约束: spring-context.xsd
(3) 开启 注解 扫描(配置文件)
<!-- 到包里面扫描类/方法/属性 上面是否有注解
如果多个包可以加逗号,可以用外层大包
-->
<context:component-scan base-package="">
</context:component-scan>
<!--只 扫描 属性上面的注解-->
<context:annotation-config></context:annotation-config>
9. Spring有哪些注解?
· 类有关的四个注解(不算@scope):
@Component
@Controller :WEB层
@Service :业务层
@Repository :持久层
目前四个功能都一样,Component衍生出的三个为了之后版本的开发
注解完成配置 创建对象单实例/多实例(对象范围注解)
类注解例子:
@Service(value="user")// 属性名是value可省略不写
@Scope(value="prototype")
public class User {
...
}
· 属性注入 的两个注解
@Autowired
不需要为属性添加setter方法;
自动装配是根据属性类型找实例,所以属性名随意,不用与配置的属性类的实例名一样。
@Soource
例子:
配置文件: 开启 注解扫描 仍需
· 开源、轻量级、一站式框架
· 两个核心:AOP和IOC
2. 为什么说Spring式一站式框架?
因为spring在javaEE三层结构中,每一层都提供不同的解决技术
web层:springMVC
service层: spring的IOC
dao层: spring的jdbcTemplete
3. IOC的底层原理?如何实现?
IOC实现用到四种技术:
xml配置文件,dom4j解析,工厂设计模式和反射。
步骤分析:
① 第一步,创建xml配置文件,配置要创建的对象类
<bean id="userService" class="cn.godce.UserService"/>
② 第二步,创建工厂类,使用dom4j解析配置文件+反射
public class UserFactory{
public static UserService getService(){
//1. 使用dom4j解析xml文件
//根据id值userService,得到id值对应的class属性值
String className="class属性值";
//2. 使用反射创建类的对象
Class clazz=Class.forName(classValue);
UserService service=clazz.newInstance();
return service;
}
③ 第三步,UserFactory.getUserService();
只用改变配置文件就可以完成程序修改了
这三步对应的spring代码就是:
ApplicationContext context=
new ClassPathXmlApplicationContext("applicationContext.xml");
Xxx obj = (Xxx)context.getBean("id");//xml配置的id
obj.method();
4. Spring核心jar包有几个?
四个,
core(核心),context(全文),bens(IOC),expression(表达式)
再搭两个日志jar包:
log4j + commons-logging
补:其实不能这样说,如果要 测试 简单的IOC操作,core+context+beans+logging就足矣。
而配置了连接池,又需要 spring-jdbc,
用的时候 大可 将熟悉的jar包 统统放入lib,等运行报错缺少啥包再往里添加就好。
5. Spring的Bean管理 是什么?
就是Spring执行IOC操作(Bean的实例化;Bean标签常用属性;Bean属性注入)。
Spring的Bean管理方式有两种:ioc的配置文件方式;ioc的注解方式。
下面先介绍 配置文件方式的Bean管理:
· Bean的实例化方式:
第一种:实用类的无参构造创建(常用)
<bean id="b1" class="xx.xx.X"></bean>
默认找你无参构造,如果xx.xx.X没有无参构造器,报错
原理就是 反射 调用clazz.newInstance()方法
第二种:使用静态工厂创建
创建静态方法 ,返回类对象
<bean id="b2" class="x.xx.B2Factory" factory-method="getBean2"></bean>
第三种:使用实例工厂创建
创建非静态方法,返回类对象
<bean id="b3Factory" class="x.xx.B3Factory"></bean>
<bean id="b3" factory-bean="b3Factory" factory-method="getBean3"></bean>
· Bean标签常用属性
id属性 : 不能包含特殊符号
name属性: 功能和id属性一样,但name属性可以包含特殊符号(_$#...)为什么出现name呢?是历史遗留问题,struts1框架的时候很多id都有特殊符号,这个时候id不能用,就用name标签了。
scope属性: 多个属性值
*singleton:单例 (默认就是 singleton)
*prototype :多例
*request :WEB项目中,Spring创建一个Bean对象,将对象存入到request域中
*session : 存到session域中
*globalSession: WEB项目中,应用在Porlet环境,如果没有此环境相当于session。
测试:
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
User user1 = (User)context.getBean("user");
User user2 = (User)context.getBean("user");
syso(user1);
syso(user2);
//如果是 singleton,则 打印的结果一样,说明是同一个对象
· Bean 属性注入
一个类的属性注入有三种方式:
① setter(常用)
② 有参构造器
③ 接口 setter
在spring框架里面,支持前两种方式
① set方法注入
<bean id="demo" class="x.xx.Demo">
<property name="username" value="zsc"></property>
</bean>
② 有参构造器
<bean id="demo" class="x.xx.Demo">
<constructor-arg name="username" value="zsc"></co.>
</bean>
P名称空间注入
xml:p="http://www.springframework.org/schema/p"
<bean id="person" class="x.xx.Person" p:pname="lucy"></bean>
复杂数据 注入:
<bean id="person" class="x.xx.Person" p:pname="lucy">
<!--数组-->
<property name="arrs">
<list>
<value>1</value>
<value>2</value>
</list>
</property>
<!--list-->
<property name="list">
同上
</property>
<!--map-->
<property name="map">
<map>
<entry key="" value=""></entry>
</map>
</property>
<!--properties-->
<property name="map">
<props>
<prop key="driverclass">com.gg.jdbc.Driver</prop>
</props>
</property>
</bean>
6.IOC和DI有什么区别?
从上面可以看出,DI就是属性注入,IOC就是Bean实例创建,所以DI是建立在IOC基础之上的。
7.Spring整合web项目(Struts/hibernate...)原理
原理就是IOC啊,通过加载spring核心配置文件得到ApplicationContext对象实例,然后IOC获取各个层的对象。
加载spring核心配置文件效率很低,如何优化?
把加载配置文件和创建applicationContext对象过程,在服务器启动时完成(把压力全给到服务器),
用到的技术:
· ServletContext 对象
在服务器启动的时候,每个项目都会产生一个唯一的对象:ServletContext
· 监听器
ServletContext创建通过监听器可以知道。
实现原理:
-在服务器启动的时候,为每个项目创建一个ServletContext对象
-在ServeltContext对象创建时,使用监听器可以监听到ServeltContext对象在什么时候创建,监听到时加载spring配置文件
-把创建出来的配置文件对象放到ServletContext域对象里面(setter)
-获取对象时候,从ServletContext域得到(getter)
· 示例 (web.xml)
<!-- 配置监听器 spring封装了一个监听器,我们只需配置就好了-->
<!--注意 这个监听器 在 spring-web-x.x.x.jar 包中-->
<listener>
<listener-class>ContextLoaderListener</listener-class>
</listener>
<!--ContextLoaderListener默认会去加载 /WEB-INF/applicationContext.xml-->
<!--所以如果你的配置文件不是默认的,还需要配置参数-->
<!--指定spring 配置文件位置-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-config.xml</param-value>
</context-param>
什么是Bean管理,就是IOC操作,包括(Bean实例化,属性注入,因为是注解所以没有<Bean>标签属性)
(1) 导入 .sop 的 .jar包 (多了 .AOP的.jar包)(2)注解管理实例 --配置文件
需要引入 新的约束: spring-context.xsd
(3) 开启 注解 扫描(配置文件)
<!-- 到包里面扫描类/方法/属性 上面是否有注解
如果多个包可以加逗号,可以用外层大包
-->
<context:component-scan base-package="">
</context:component-scan>
<!--只 扫描 属性上面的注解-->
<context:annotation-config></context:annotation-config>
9. Spring有哪些注解?
· 类有关的四个注解(不算@scope):
@Component
@Controller :WEB层
@Service :业务层
@Repository :持久层
目前四个功能都一样,Component衍生出的三个为了之后版本的开发
注解完成配置 创建对象单实例/多实例(对象范围注解)
类注解例子:
@Service(value="user")// 属性名是value可省略不写
@Scope(value="prototype")
public class User {
...
}
· 属性注入 的两个注解
@Autowired
不需要为属性添加setter方法;
自动装配是根据属性类型找实例,所以属性名随意,不用与配置的属性类的实例名一样。
@Soource
例子:
@Resource(name="userDao")//这里必须名字相同 类似ref
配置文件: 开启 注解扫描 仍需