1.1介绍
-
2002,首次推出spring框架的雏形,interface21框架
-
Spring框架以及interface21框架为基础,经过冲新设计并不断丰富其内涵,2004年3月24日发布了1.0正式版本
-
Spring理念:实现有的技术更加容易使用,本身就是一个大杂烩,整合了现有的技术框架
-
优点
1.spring是一个免费开源的框架(容器)
2.spring是一个轻量级的,非入侵似的框架(引入不会改变工程内的原有的代码,只会让他更加简单)
3.控制反转(IOC)和面向切面编程(AOP)(最重点的)
4.支持事务的处理,对框架整合的支持
总结一句话:spring是一个轻量级的控制反转(IOC)和面向切面的编程(AOP)框架
-
2.IOC理论推导
IoC 全称为 InversionofControl
,翻译为 “控制反转”,它还有一个别名为 DI( DependencyInjection
),即依赖注入
在我们之前的业务中,用户的需求可能会印象问哦们原来的代码我们需要根据用户需求去修改源代码 如果程序代码量十分大,修改一次的成本十分昂贵!
我们使用一个set接口实现,已经发生革命性的改变
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
IOC本质
控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法
控制 : 谁来控制对象的创建 , 传统应用程序的对象是由程序本身控制创建的 , 使用Spring后 , 对象是由Spring来创建的 .
反转 : 程序本身不创建对象 , 而变成被动的接收对象 .
依赖注入 : 就是利用set方法来进行注入的.
IOC是一种编程思想 , 由主动的编程变成被动的接收 .
可以通过newClassPathXmlApplicationContext去浏览一下底层源码 .
到了现在 , 我们彻底不用再程序中去改动了 , 要实现不同的操作 , 只需要在xml配置文件中进行修改 , 所谓的IoC,一句话搞定 : 对象由Spring 来创建 , 管理 , 装配 !
4.IOC创建对象的方法
1.使用无参构造创建对象默认
总结:在配置文件加载中的时候,容器中管理的对象已经被实例化了
5.Spring配置
5.1别名
<!-- 别名的意思 --> <alias name="sql1" alias="sql4"/>
5.2 Bean的配置
<!-- <bean id="sql" class="com.my.dao.MysqlDaolmpl" name="sql1"/> name 起别名的意思 name比较强大后面可以跟多个别名 --> <bean id="sql" class="com.my.dao.MysqlDaolmpl" name="sql1,sql2"/>
5.3 import
这个import,一般用于团队开发使用,他可以将多个配置文件,导入合并为一个
假设现在像雾中多个人开发,这三个人复制不同的类开发,不同的类需要之策在不同的bean中,我们可以利用import将所有人的benans.xml合并为一个总的
1.张三
2.李四
3.王五
4.appilcationContext.xml
<import resource="betns.xml"/>
<import resource="betns.xml"/>
<import resource="betns.xml"/>
使用的时候,直接使用总配置就可以了
6.依赖注入
6.1 构造器注入
public UserServiceImpl(UserDao userDao) { this.userDao = userDao; }
6.2 set注入依赖
依赖注入:set注入
依赖:bean对象的创建依赖于容器
注入:bean对象中所有属性,有容器来注入
【环境搭建】
1.复杂性
public class Address { public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } private String address; }
2.真实测试对象
public class Student { private String name; private Address address; private String[] books; private List<String> hobbs; private Set<String> games; private Map<String,String> car; private String wife; private Predicate info;
-
beans.xml
-
<bean id="address" class="cn.my.zhao.pojo.Address"> <property name="address" value="西安"/> </bean> <bean id="student" class="cn.my.zhao.pojo.Student"> <property name="address" ref="address"/> <property name="car"> <map> <entry key="name" value="赵斌"/> <entry key="age" value="18"/> <entry key="sun" value="男"/> </map> </property> <!-- 数组注入 --> <property name="books"> <array> <value>红楼梦</value> <value>水浒传</value> <value>西游记</value> </array> </property> <!-- set注入 --> <property name="games"> <set> <value>英雄联盟</value> </set> </property> <!-- null值注入--> <property name="wife"> <null/> </property> <!-- Properties --> <property name="info"> <props> <prop key="url">mysql</prop> </props> </property> </bean>
-
测试成功
@Test public void b(){ ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); Student student = (Student) context.getBean("student"); System.out.println(student.toString()); }
6.3 bean的作用域
1.单列模式(spring默认机制)
2.原型模式:内次从容器中get的时候会产生一个新对象
3.其余的request、session、application、这些智能在web开发中使用到
6.3bean的作用域
1.单列模式(spring默认机制)
<bean id="user" class="cn.my.zhao.pojo.User" p:name="赵四" p:age="18" scope="singleton"/
2.原型模式:内次从容器中get的时候会产生一个新对象
<bean id="user2" class="cn.my.zhao.pojo.User" c:name="张三" c:age="19" scope="prototype"/>
3.其余的request、session、application、这些智能在web开发中使用到
7.Bean的自动装配
7.1 测试
环境搭建:一个人两个宠物
7.2 ByName自动装配
<bean id="cat" class="cn.my.zhao.pojo.Cat"/> <bean id="dog" class="cn.my.zhao.pojo.Dog"/> <bean id="people" class="cn.my.zhao.pojo.People" autowire="byName"> <property name="name" value="三人行"/> </bean>
7.3 ByType自动装配
<bean class="cn.my.zhao.pojo.Cat"/> <bean class="cn.my.zhao.pojo.Dog"/> <bean id="people" class="cn.my.zhao.pojo.People" autowire="byType"> <property name="name" value="三人行"/> </bean>
小结:
1.byname的时候,需要保证所有bean的id唯一,并且这个bean需要和自动注入的属性的set方法的值一致
2.bytype的时候,需要保证所有的本案的class唯一并且这个bean需要和自动注入的属性的类型一致
7.4 使用注解实现自动装配
jdk1.5支持注解,spring2.5就支持注解了!
要使用注解须知:
1.导入约束,context约束
2.配置注解的支持 context:annotation-config/
<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" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd"> <!--注解的支持--> <context:annotation-config/> </beans>
@Autowired
直接在属性上使用即可!也可以在set方式上使用
使用Autowied我们可以不用编写set方法了前提是你这个自动装配的属性在IOC容器中存在且符合名字byname
如果@Autwired自动装配的环境比较复杂,自动装配无法通过一个注解【@Autowired】完成的时候,我们可以使用@Qualifier(value="xxx")去配置@Autowired的使用,指定一个唯一的bean对象注入
这是一套组合使用(常用)
public class People { @Autowired @Qualifier("cat11") private Cat cat; @Autowired @Qualifier("dog22") private Dog dog; }
@Resource注解
public class People { @Resource private Cat cat; @Resource(name = "dog22") private Dog dog; }
小结:
@Autwired和@Resource区别:
都是用字自动装配的,都可以放在属性字段上
@Autwired通过bytype的方法实现 而且必须要求对象存在【常用】
@Resource默认通过byname的方式实现,如果找不到名字则通过bytype实现 !如果两个都找不到的情况下就报错【常用】
执行顺序不同@Autwired通过bytype的方法实现。@Resource默认通过byname的方式实现
8使用注解开发
1.bean
2.属性如何注入
//@Component 组件 等价于 <bean id="user" class="cn.my.zhao.pojo.User"/> @Component public class User { public String name = "赵斌"; @Value("赵斌1")//相当于 <property name="name" value="zhaobin"/> public void setName(String name) { this.name = name; } }
3.衍生的注解
@Component
有几个衍生注解,我们呢子啊web开发中会按照mvc三层架构分层
4.自动装配置
5.作用域
6.小结