spring发展
2002 Rod Johnon
Spring 2003 ,IOC Aop
产品:Spring data,spring boot,spring cloud,spring framework ,spring social
IOC:控制反转(亦称 DI:依赖注入)
对象创建发展史: new 创建 -> 简单工厂 -> 超级工厂(ioc)
控制反转 :将 创建对象、属性值 的方式 进行了翻转,从new、setXxx() 翻转为了 从springIOC容器getBean()
依赖注入:将属性值 注入给了属性,将属性 注入给了bean,将bean注入给了ioc容器;
无论要什么对象,都可以直接去springioc容器中获取,而不需要自己操作(new\setXxx())
因此之后的 ioc 分为2步:1 先给springioc中存放对象并赋值 2 拿
1、jar
开发spring至少需要使用的jar(5个+1个):
spring-aop.jar 开发AOP特性时需要的JAR
spring-beans.jar 处理Bean的jar <bean>
spring-context.jar 处理spring上下文的jar <context>
spring-core.jar spring核心jar
spring-expression.jar spring表达式
三方提供的日志jar
commons-logging.jar 日志
2、编写配置文件 applicationContext.xml
实体类
实现对应的getter and setter 方法
public class Student {
private int stuNo ;
private String stuName ;
private int stuAge ;
}
加入IOC容器
id:唯一标识符 class:指定类型
<bean id="student" class="org.zq.entity.Student">
<property name="stuNo" value="2"></property>
<property name="stuName" value="ls"></property>
<property name="stuAge" value="24"></property>
<!--
property:该class所代表的类的属性
name:属性名
value:属性值
-->
</bean>
3、开发Spring程序(IOC)
//获取IOC容器对象
ApplicationContext conext = new ClassPathXmlApplicationContext("applicationContext.xml") ;
//从IOC获取学生对象
Student student = (Student)conext.getBean("student") ;
IOC容器赋值:如果是简单类型(8个基本+String),value;
如果是对象类型,ref=“需要引用的id值”,因此实现了 对象与对象之间的依赖关系
conext.getBean(需要获取的bean的id值)
实现注入(赋值)的三种方式
1.set注入:通过setXxx()赋值
默认使用的是 set方法();
依赖注入底层是通过反射实现的。
** 标签:<property…>
2.构造器注入:通过构造方法赋值
<constructor-arg value=“ls” type=“String” index=“0” name=“name”></constructor-arg>
相关属性
index: 参数的索引位 从 0 开始(不推荐使用)
name:参数名 (推荐使用)
type: 参数类型
value: 参数值
3.p命名空间注入
<bean id=“teacher” class=“org.zq.entity.Teacher” p:age=“25” p:name=“ww” ></bean>
注意:
使用p命名空间注入时, 需要先引入p命名空间
xmlns:p="http://www.springframework.org/schema/p"
简单类型:
p:属性名="属性值"
引用类型(除了String外):
p:属性名-ref="引用的id"
注意多个 p赋值的时候 要有空格。
注意**
无论是String还是Int/short/long,在赋值时都是 value="值" ,
因此建议 此种情况 需要配合 name\type进行区分
给对象类型赋值null :
<property name="name" >
<null/> -->注意 没有<value>
</property>
赋空值 ""
<property name="name" >
<value></value>
</property>
对集合类型赋值(array、list、set、map、properties)
都有相对应的标签
1、<list>
<value>
2、<array>
<value>
3、 <set>
<value>
4、<map>
<entry>
<key>
<value>
<value>
5、<props>
<prop key="foot4">足球4</prop>
某些可以混着用但是不建
自动装配
<bean ... class="org.zq.entity.Course" autowire="byName|byType|constructor|no" >
byName本质是byId
byName
: 自动寻找:其他bean的id值=该Course类的属性名byType
: 其他bean的类型(class) 是否与 该Course类的ref属性类型一致 (注意,此种方式 必须满足:当前Ioc容器中 只能有一个Bean满足条件 )constructor
: 其他bean的类型(class) 是否与 该Course类的构造方法参数 的类型一致;此种方式的本质就是byType
全局自动装配
可以在头文件中 一次性将该ioc容器的所有bean 统一设置成自动装配:
<beans xmlns="http://www.springframework.org/schema/beans"
...
default-autowire="byName">
自动装配虽然可以减少代码量,但是会降低程序的可读性,使用时需要
谨慎
。
使用注解定义bean:通过注解的形式 将bean以及相应的属性值 放入ioc容器
<context:component-scan base-package="org.zq.dao">
自动装配流程
- </context:component-scan>Spring在
启动
的时候,会根据base-package在 该包中扫描所有类,查找这些类是否有注解@Component(“studentDao”),如果有,则将该类 加入spring Ioc容器。
会扫描该注解
@Component细化:
dao层注解:@Repository
service层注解:@Service
控制器层注解:@Controller