Spring学习总结-1

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包:

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>


8.Spirng的Bean管理-注解方式!

什么是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


· 配置文件和注解混合使用(对象实例 用配置文件 ,属性 用注解)
配置文件: 开启 注解扫描 仍需
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值