个人对Spring的初级理解:
由于程序开发过程中对象之间的依赖关系导致功能之间耦合度太高,不利于代码维护和功能添加,功能独立,且之间耦合度低显然利大于弊,Spring作为一个管理Bean的容器,无论是基于xml还是annotation的方式开发,都是根据唯一的一个标识取得对应的类"全限定名称"通过反射创建对象的,这个创建对象的工作交给Spring中的Bean工厂,这样使用Bean的通过工厂取得即可,也就降低了原来的强耦合关系。这指的就是IOC(Inversion of control)。
不是非要使用这个框架才可以开发的,传统的采用合理的设计模式也可以达到一样的效果,只不过框架是将那些不变性的操作做了封装,使开发人员只注重业务逻辑的实现,提高开发效率罢了。
Spring基于xml的使用:
//spring可以根据对象的作用范围(singleton/prototype)来自动选择延迟还是立即创建对象
1.Spring创建对象(IoC)的三种方式:
a.使用默认的构造函数创建,bean标签只配置id和class属性
b.使用工厂的实例方法创建对象必须先有对象才能调用方法
c.使用工厂的静态方法创建对象
2.bean对象的作用范围
默认是单例的
使用scope属性:指定bean的作用范围
取值:singleton、prototype、request、session、global-session
request作用于web应用的请求范围
session作用于web应用的会话范围
global-session作用于集群环境的会话范围(全局会话范围,不是集群时就是session)
3.spring的注入方式:
a.构造方法注入
b.set方法注入
<bean id="setService" class="com.service.impl.UserServiceImpl">
<property name="name" value="mia"/>
<property name="age" value="23"/>
<property name="birthday" ref="time"/>
</bean>
复杂类型数据的注入
private String[] strings;
private List<String> list;
private Set<String> set;
private Map<String,String> map;
private Properties properties;
用于给List结构注入的标签有:
list,array,set
用于给Map结构注入的标签有:
map,props
【注】只要结构相同,标签是可以根据存储数据的要求互换的,平时记住有list和map
两种结构就ok
4.bean对象的生命周期
单例:
出生:容器创建对象创建
活着:容器存在对象存在
死亡:容器销毁对象销毁
多例:
出生:使用时容器创建
活着:使用时的会存货
死亡:当对象长时间不用GC回收
小结:spring Ioc是为了降低类之间的依赖关系,将bean的管理交给spring容器去管理,所以
称为控制反转,spring DI相当于使用有参构造需要传入参数的作用,只是交给了spring通过配置
来注入数据,可以通过构造器注入也可通过set方法注入
Spring基于注解的使用,暂且分为一下几种注解:
对于注解使用,如果不知道改写什么属性,点开源码看一下就知道,或者查一下,多查多总结。
1.注入对象
@Component和它相同作用的注解有@Controller @Service @Repository
@Autowired是自动根据类型注入(作用于类或属性)绕过key直接在容器中找与它类型一致的,如果有多个可以匹配的,会先根据变量名匹配注解的值,如果都不匹配会报错
@Qualifier可以指定实现类,但必须配合@Autowired使用
@Resource(name = "userDao2")可单独使用
注:以上几种只能注入bean类型的数据,对于基本类型和String是无能为力的,集合类型的注入只能通过xml实现
2.注入数据
@Value用于注入基本类型和String类型的数据,它可以使用SpEL(SpringEL表达式)
语法${表达式}
3.作用范围
@Scope用于指定bean的范围
4.生命周期
@PreDestroy指定销毁方法
@PostConstruct指定初始化方法
对于EL表达式的区分:
Jsp、Mybatis、Spring中都有,谁的场景就是谁的EL表达式。
再提一下Mybatis中${}和#{}的效果不同点在于$是直接取值,而#取值会加上""。
比如age = 5,age = ${name},那么age = 5;
比如age = 5,age = #{name},那么age = "5";