个人总是看完教学视频,然后就以为会了, 然而比如别人问,说说你对spring的理解,就只知道说个IOC和AOP,还说的不太对,所以想要成为高手,必须要学会总结,只有你把学的东西一条条列出来,说出来,并都理解且能够应用到实际,你才可以说,这玩意,你会了。
1,什么是Spring
Spring是一个开源框架,是从2003年兴起的一个轻量级的java开发框架,由Rod Johnson创建。简单来说,Spring是一个分层的javaSE/javaEE一站式的开源框架。
1.1,什么是一站式框架
一站式框架就是有javaEE每一层解决方案的框架。
spring在WEB层有:Springmvc,Service层有:Spring的Bean管理,Spring的声明式事务
DAO层有:Spring的jdbc模板,Spring的ORM模块(用于与ORM框架整合,如 maybatis,hibernate)
2,Spring的优点
![46c705f1b34e325c656a34af5c434a2a.png](https://i-blog.csdnimg.cn/blog_migrate/a8ddced9e15db04d361bc07b79d9bb1a.jpeg)
3,什么是IOC
Inversion of control(控制反转):将对象的创建权反转给Spring。
IOC的好处(代码解释)
public interface UserDao {
public void save();
}
public class UserDaoJdbcImpl implements UserDao {
@Override
public void save() {
System.out.println("UserDaoJdbcImpl 执行了...");
}
}
public class UserDaoMybatisImpl implements UserDao {
@Override
public void save() {
System.out.println("UserDaoMybatisImpl 执行了...");
}
}
// 传统调用UserDaoImpl的方式
UserDao userDao = new UserDaoJdbcImpl();
// 如果我们想调用UserDaoMybatisImpl就必须要改源码
UserDao userDao = new UserDaoMybatisImpl();
// 工厂方法
public class BeanFactory {
public static UserDao getUserDao() {
return new UserDaoJdbcImpl();
}
}
// 同样如果我们想调用UserDaoMybatisImpl虽然不用改接口了,可还是要修改工厂类
return new UserDaoMybatisImpl();
// IOC的方法就是工厂+反射+配置文件
// 配置文件
<bean id="userDao" class="xxx.xxx.xxx.UserDaoJdbcImpl" />
// 工厂
public class BeanFactory {
public static Object getBean(String id) {
// 解析配置文件
ApplicationContext ac = new ClassPathXmlApplicationContext("xxx.xml");
// 反射
Class<?> forName = UserDao.class.forName(id);
return forName.newInstance();
}
// 这样如果我们想调用UserDaoMybatisImpl就不用修改代码了只需要修改配置文件就行了
<bean id="userDao" class="xxx.xxx.xxx.UserDaoMybatisImpl" />
4,什么是DI
DI:依赖注入,前提必须有IOC的环境,Spring管理这个类的时候将类的依赖的属性注入(设置)进来。
5,Spring的工厂类
![19037a8a9b463912021c11741f693a41.png](https://i-blog.csdnimg.cn/blog_migrate/dd8e3c80d5aca885eb2a86dd0c88bf57.jpeg)
1)老版本的工厂类
BeanFactory:调用getBean的时候,才会生成类的实例
2)新版本的工厂类
ApplicationContext:在加载配置文件的时候,就将spring管理的类都实例化
ApplicationContext是接口,它有2个实现类
(1)ClassPathXmlApplicationContext:加载类路径下的配置文件
(2)FileSystemXmlApplicationContext:加载文件系统下的配置文件如/usr/local/a.xml
6,<bean>标签的配置
1)id和name的区别
id:使用了约束中的唯一约束。里面不出现特殊字符如/?之类的
name:没有唯一约束(理论上可以重复,实际开发不能出现),可以出现特殊字符
2)bean的生命周期
init-method:bean被初始化的时候执行的方法。
destroy-method:bean被销毁的时候执行的方法(要满足2个条件1,bean是单列,2工作关闭)
3)bean的作用范围 scope属性
singleton :默认的,Spring会采用单例的模式创建这个对象
prototype :多例模式。(Struts2和Spring整合一定会用到)
request :应用在web项目中,Spring创建这个类以后,将这个类存入到request范围中。
session :应用在web项目中,Spring创建这个类以后,将这个类存入到session范围中。
globalsession :应用在web项目中,必须在porlet环境下使用。但是如果没有这种环境,相对于session。
7,spring的属性注入
1)构造方法的属性注入
<bean id="user" class="xxx.User">
<constructor-arg name="name" value="老周"/>
<constructor-arg name="age" value="25"/>
</bean>
2) Set方法的方式的属性注入
<bean id="user" class="xxx.User">
<property name="name" value="老周"/>
<property name="age" value="25"/>
</bean>
3) P名称空间的属性注入(spring2.5以后,现在应该不会有人还用2.5前的版本把=-=)
// 写法:普通属性 p:属性名=”值” 对象属性 p:属性名-ref=”值”
<bean id="car" class="xxx.Car" p:name="QQ" p:price="20000"
<bean id="user" class="xxx.User" p:name="老周" p:age="25" p:car-ref="car"></bean>
4) SpEL的属性注入(Spring3.0以后)
// SpEL:Spring Expression Language,Spring的表达式语言。
<bean id="user" class="xxx.User">
<property name="name" value="#{user.name}"/>
<property name="age" value="#{user.age}"/>
</bean>
5) 集合类型的属性注入
<!-- Spring的集合属性的注入============================ -->
<!-- 注入数组类型 -->
<bean id="collectionBean" class="com.itheima.spring.demo5.CollectionBean">
<!-- 数组类型 -->
<property name="arrs">
<list>
<value>王东</value>
<value>赵洪</value>
<value>李冠希</value>
</list>
</property>
<!-- 注入list集合 -->
<property name="list">
<list>
<value>李兵</value>
<value>赵如何</value>
<value>邓凤</value>
</list>
</property>
<!-- 注入set集合 -->
<property name="set">
<set>
<value>aaa</value>
<value>bbb</value>
<value>ccc</value>
</set>
</property>
<!-- 注入Map集合 -->
<property name="map">
<map>
<entry key="aaa" value="111"/>
<entry key="bbb" value="222"/>
<entry key="ccc" value="333"/>
</map>
</property>
</bean>
8,spring分模块的配置
// 代码中
ApplicationContext ac = new ClassPathXmlApplicationContext("xxx.xml", "xxx.xml");
// 配置文件中
<import resource="xxx.xml"/>
9,ContextLoaderListener
1)作用
每次请求都会创建一个Spring的工厂,这样浪费服务器资源,应该一个项目只有一个Spring的工厂。
在服务器启动的时候,创建一个Spring的工厂。
创建完工厂,将这个工厂类保存到ServletContext中。
每次使用的时候都从ServletContext中获取。
使用ServletContextListener
监听ServletContext对象的创建和销毁。
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
今天就总结到这里了,spring一共总结3篇,接下来就是springmvc,mybatis...
我老周一定会成为大神的,0.0