Spring学习笔记(一)
1、什么是Spring
1.1、简介
Spring是Java EE编程领域的一个轻量级开源框架,该框架由 一个叫Rod Johnson的程序员在 2002 年最早提出并随后创建, 是为了解决企业级编程开发中的复杂性,实现敏捷开发的应用型框架
1.2、优点
- Spring是一个开源的免费的框架(容器)
- Spring是一个轻量级的、非入侵式的框架
- 控制反转(IOC),面向切面编程(AOP)
- 支持事务处理,对框架整合的支持
Spring的优点可以用一句话来概括: Spring 就是一个轻量级的控制反转(IOC)和面向切面编程(AOP)的框架
1.3、核心架构组成(了解)
1、Spring Core:
? 是框架最基础的部分,提供了IOC和依赖注入的特性。这里提供了一个基础的概念叫:BeanFactory,允许从你的程序逻辑中分离依赖关系和配置
2、Spring Context
? 构建Core封装包基础上的Context包,提供了一种框架式的对象访问的方法。Context封装包的特性来自于Beans封装包,并且添加了对国际化的支持,还包含了事件的传播,资源的封装的方式和Context的透明创建。
3、Spring DAO
? DAO(Data Accsee Object)提供了jdbc的抽象层,可以消除冗长的jdbc代码和解析数据库厂商特有的错误代码。并且,jdbc封装包还提供了一种比编程性更高的声明事务管理的方法,不仅仅是实现了特定的接口,对所有的pojo(dto)都适用的方法。
4、Spring ORM
? orm封装包提供了常用的"对象/关系"映射的集成层。其中包含JPA、JDO、Hibernate和Mybatis。利用ORM的封装包可以混合使用所有的Spring提供的对于"对象和关系"的映射。
5、Spring AOP:
? Spring的AOP封装包的作用是规范程序面向编程的实现,可以定义一些功能,比如方法的拦截器,从逻辑上讲,减弱了代码之间的耦合性,类与类功能与功能之间的关系被清晰的分离开,可以轻松的将各种行为信息给合并到代码中
6、Spring web
? Spring中web包提供了基础的针对web开发的集成特性,比如多方的文件上传,利用Servlet listeners进行IOC容器的初始化。可以将spring和其他的框架进行融合
7、Spring web mvc
? 提供的是一个web应用的mvc(Model - Vice - Controller)的实现。spring的mvc框架并不是仅仅提供了传统的实现,它还提供了一种清晰的分离模式,在领域模型代码和web Form之间。并且,可以借助Spring框架的其他特性来完成功能。
2、Spring-IOC
? IOC(Inverse Of Control),控制反转,也被称为DI(依赖注入);将原本由开发者自己创建的对象,交给Spring容器来进行创建,原本需要注入的属性值交给容器来进行注入,使得开发人员整能够将更多的精力转移到业务领域去。并且Spring推荐使用面向接口编程的方式,结合IOC将各个层次之间实现高度的解耦,让程序的可扩展性和可维护性更高。
高内聚,低耦合 ? 耦合性高:类与类之间有着很强的联系,一个类中某一个变量或者方法或者元素的改变会使得与它相关联的其他的内容全部都发生改变。
2.1、setter注入
<bean id="exampleBean" class="examples.ExampleBean">
<property name="beanOne">
<ref bean="anotherExampleBean"/>
</property>
<property name="beanTwo" ref="yetAnotherBean"/>
<property name="integerProperty" value="1"/>
</bean>
<bean id="anotherExampleBean" class="examples.AnotherBean"/>
<bean id="yetAnotherBean" class="examples.YetAnotherBean"/>
2.2、构造器注入
<bean id="exampleBean" class="examples.ExampleBean">
<constructor-arg type="int" value="7500000"/>
<constructor-arg type="java.lang.String" value="42"/>
</bean>
<bean id="exampleBean" class="examples.ExampleBean">
<constructor-arg index="0" value="7500000"/>
<constructor-arg index="1" value="42"/>
</bean>
<bean id="exampleBean" class="examples.ExampleBean">
<constructor-arg name="years" value="7500000"/>
<constructor-arg name="ultimateAnswer" value="42"/>
</bean>
2.3、拓展方式注入
通过使用Spring框架中的c标签和p标签的方式注入,在使用这两个标签前记得先导入依赖
- c标签所需依赖:xmlns:c=“http://www.springframework.org/schema/c”
- p标签所需依赖:xmlns:p=“http://www.springframework.org/schema/p”
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p" //使用p标签需要导入的依赖
xmlns:c="http://www.springframework.org/schema/c" //使用c标签需要导入的依赖
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="user" class="com.softeem.pojo.User" p:name="张三" p:age="20"/>
<bean id="user2" class="com.softeem.pojo.User"
p:name="李四"
p:age="15"
p:person-ref="person"/>
<bean id="person" class="com.softeem.pojo.Person" p:pname="王五"/>
<bean id="user3" class="com.softeem.pojo.User" c:_0="程妍" c:_1="20"
c:_2-ref="person"/>
</beans>
2.4、创建对象时对复杂类型的属性赋值
实体类:
public class Student{
private int sid;
private int age;
private String name;
private String[] tels;
private List<String> funs;
private Map<String,String> stringMap;
public void setSid(int sid) {
this.sid = sid;
}
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public void setTels(String[] tels) {
this.tels = tels;
}
public void setFuns(List<String> funs) {
this.funs = funs;
}
public void setStringMap(Map<String, String> stringMap) {
this.stringMap = stringMap;
}
}
xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="stu" class="com.softeem.dto.Student">
<property name="sid" value="10086"/>
<property name="age" value="23"/>
<property name="name" value="张三"/>
<property name="tels">
<array>
<value>110</value>
<value>120</value>
<value>119</value>
<value>112</value>
</array>
</property>
<property name="funs">
<list>
<value>唱</value>
<value>跳</value>
<value>rap</value>
<value>篮球</value>
</list>
</property>
<property name="stringMap">
<map>
<entry key="qq" value="123123"/>
<entry key ="wechat" value="q123123"/>
</map>
</property>
</bean>
<bean>
<props>
<prop key="administrator">administrator@example.org</prop>
<prop key="support">support@example.org</prop>
<prop key="development">development@example.org</prop>
</props>
</bean>
</beans>
2.5、Bean的作用域
bean的作用域(Scope)有六种
- singleton
- prototype
- request
- session
- application
- websocket
(1) singleton(单例模式)
<bean id="user" class="com.softeem.pojo.User"
c:_0="丫丫"
c:_1="20"
c:_2-ref="person"
scope="singleton"/>
(2)prototype(原型模式)
<bean id="person" class="com.softeem.pojo.Person" p:pname="王五" scope="prototype"/>
(3)request、session、application、websocket只能在web开发中用到
3、bean的自动装配
- 自动装配是Spring满足bean依赖的一种方式
- Spring会在上下文中自动寻找,并自动给bean装配属性
在Spring中有三种自动装配的方式
? 1、在xml中显示的配置
? 2、在java中显示配置
? 3、隐式的自动装配bean
举例:一个人有两个宠物
3.1、xml文件中bean的autowire属性
- ByName自动装配
<bean id="cat" class="com.softeem.pojo.Cat"/>
<bean id="dog" class="com.softeem.pojo.Dog"/>
<bean id="people" class="com.softeem.pojo.People" autowire="byName">
<property name="name" value="小囡囡呀"/>
</bean>
- ByType自动装配
<bean class="com.softeem.pojo.Cat"/>
<bean id="dog1" class="com.kuang.pojo.Dog"/>
<bean id="people" class="com.kuang.pojo.People" autowire="byType">
<property name="name" value="小双双呀"/>
</bean>
小结:
- byName的时候,需要保证所有bean的id唯一,并且这个bean需要和自动注入的属性的set方法的属性的值一致!
- byType的时候,需要保证所有bean的class唯一,并且这个bean需要和自动注入的属性的类型一致!
3.2、使用注解实现自动装配
java1.5开始支持注解,spring2.5开始 要使用注解须知:
- 导入约束:context约束
- 配置注解的支持:context:annotation-config
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
</beans>
@Autowired
直接在属性上使用即可!也可以在set方法上使用!
使用Autowired可以不用编写Set方法,前提是这个自动装配的属性在 IOC(Spring)容器存在且符合byType
拓展: @Nullable 字段标记了这个注解,说明这个字段可以为null
public class People {
@Autowired(required = false)
private Cat cat;
@Autowired
private Dog dog;
private String name;
}
public class People{
@Autowired
@Qualifier("dogH")
private Dog dog;
private String name;
}
@Resource注解
public class People {
@Resource(name = "catD")
private Cat cat;
@Resource
private Dog dog;
}
@Resource和@Autowired的区别:
- 都是用来自动装配的,都可以放在属性字段上
- @Autowired是通过byType的方式实现,而且要求这个对象必须存在
- @Resource 默认通过byame的方式实现,如果找不到名字,则通过byType实现!如果两个都找不到的情况下,就报错!
- 执行顺序不同:@Autowired 通过byType的方式实现。@Resource 默认通过byName的方式实现
|