依赖注入(DI)定义:
在运行时,由外部容器动态地将依赖对象注入到组件中。
ioc 与 di 的区别:
1.IOC 与DI 描述的是同一件事;
2.IOC 强调的是将对象的创建权 反转
到
IoC 容器中
。
3.
DI 强调 IoC容器将对象的依赖关系,动态注入到对象之中 ,DI是控制反转具体的实现过程。
spring
的模块:
1》Sprin 核心容器:
管理
spring
应用中
Bean的创建,配置和管理。该模块包括了springBean
工厂,为
spring提供了DI
的
功能。
2》.AOP:
面向切面编程。是面向对象编程的一个补充
3》.数据
访问与集成
spring JDBC
对原来的代码提供了封装,
spring
还提供了
ORM模块
,可以对众多
ORM框架
集成。
4》
WEB
与远程调用:
spring
可以与多种
MVC框架
集成,例如:
struts,JSF等
。
spring本身提供了springMVC,
后面会相继
的学习。
5》
Instrumentation
为
JVM添加
代理功能。
6》测试
spring提供
了测试模块,以致力于
spring应用的测试。
spring
的
重要性:
WEB
开发的框架技术有
SSH
( Struns + spring + hibernate ),
SSM
( SpringMVC + spring + Mybatis),
因此无论日后的开发用那套架构,都要用到
spring
,可见
spring的重要性。并且
,
spring贯穿了我们WEB开发
的三层
,将
web层,service层,dao层和PO层
,无缝整合
什么是Spring:
spring是
一个
开源的
,轻量级
的控制反转(
Inversion of Control,IoC)
和面向切面(
AOP
)的容器框
架
.
用来配置
bean,并
维护
bean之间
的关系。
什么是反转(IOC):
就是应用本身不负责依赖对象的创建和维护,依赖对象的创建和维护是由外部容器负责的。这样控制权就移交给了外部容器,
控制权的转移
就是控制反转
(IOC)
。
Spring容器的功能:
配置
bean,
并维护
bean
之间的关系。
bean是什么:
是
java
中任何一种对象,可以是一个
javabean/service/action/dao/
数据源。
搭建
spring
环境(
H
elloWorld
):
1. spring的下载:
2.创建
工程,加载
jar包:
如果用
spring的
基本功能,只用核心容器的
jar包
即可:
spring-beans-4.0.4.RELEASE.jar,
spring-core-4.0.4.RELEASE.jar,
spring-context-4.0.4.RELEASE.jar,
spring-expression-4.0.4.RELEASE.jar,
和spring依赖的jar包和其它的jar包:commons-logging.jar, junit.jar,
log4j-1.2.17.jar
即可
3.spring的配置文件模板:
该配置文件可以从
spring的参考
手册或者是
spring的例子中得到。
配置文件的取名可以任意,文件可以放在任何目录下,但是考虑到通用性,
一般放在类的根路径下。
4.schema文件:
<
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"
>
A)
xmlns
,表示的命名空间,表示使用所有标签的默认命名空间
B
)xmlns:xsi:
声明XML Schema
实例,声明后就可以使用
schemaLocation
属性了
声明前缀为
C
ontext
的命名空间,后面的
URL
用于标识命名空间的名称,作用就是赋予命名空间一个唯一的名称,
D
)
xsi:schemaLocation
定义了
XML Namespace和对应的 XSD(Xml Schema Definition)文档的位置的关系。
它的值由一个或多个
URI引用对组成,两个URI之间以空白符分隔(空格和换行均可)。第一个URI是定义的 XML Namespace的值,第二个URI给出Schema文档的位置,Schema处理器将从这个位置读取Schema文档,
该文档的
targetNamespace必须与第一个URI相匹配
。
5.创建并且
配置
java Bean:
6.
传统方式调用
HelloWorld :
在
main方法中,new一个实例,调用他的set,和printHello()
方法
7.
用
spring
调用
HelloWorld:
8.实例化spring容器有三种方式:
方法一:
在类路径下寻找配置文件来实例化容器
ApplicationContext context =new ClassPathXmlApplicationContext(Spring XML名称);
方法二:
在文件系统路径下寻找配置文件来实例化容器
applicationContext= new FileSystemXmlApplicationContext("绝对路经");
方法三:
XmlWebApplicationContext
从
web中加载
,当
tomcat启动的时候就会自动加载
2.实例化
容器时,
spring配置文件可以指定多个,通过String数组
引入
applicationContext= new ClassPathXmlApplicationContext(new String[]{"文件名,文件名..."});
3.从spring容器中得到bean
当
spring容器启动后,
因为
spring容器可以管理bean对象的创建,销毁等生命周期,所以我们只需从容器中直接获取bean对象就行
,代码如下:
xml文件中<bean id="" name="" class="实现类/实体类全限定类名">(id与name两种命名之间的区别:)
1.id 与name一样都是命名
2.id与name一样不可重复
3.id只可以用一个别名
4.name可以有多个命名
匿名:
<bean
class
="
实现类或实体类的全限定类名
"></bean>
不需要写id属性测试或者运用时
方法
的参数要写为
class
的
值
getBean
("
class内容
")
非注解的属性中注入:
id:命名;
class:实体类或实现类的全限定类名;
index:序号;
name:属性名;
type:类型;
value:值;
Set属性注入:
<bean id="" class="">
<property name="" vslue=""></property>
</bean>
<bean id="" class="">
<property name="">
<value> </value>
</property>
</bean>
《简版:
格式:p:属性名="值"
<bean id="" class=""
p:name="" p:age="">
</bean>
构造器属性注入:
<bean id="" class="">
<constructor-arg index="" type="" value=""></constructor-arg>
</bean>
《简版:
格式:c:属性名="值"
<bean id="" class=""
c:name=""
c:age="">
</bean>
引用其他注入:
ref:应用的id命名;
<bean id="buser" class="dao.buser">
<property name="user"
ref="u"></property>
</bean>
《简版:
格式:c:属性名-ref="引用id命名"
<bean id="cuser" class="dao.buser"
c:user-ref="u"></bean>
自动注入:
<bean id="letterservicelmpl" class="letter.service.LletterServiceImpl"
autowire="constructor">
</bean>
autowire:自动注入;
constructor:
构造器自动注入
在根据构造器参数的类型去查找依赖对象,类似于 byType;
如果存在多个该类型的bean,也会报错
如果没有成功注入(也就是说没有找到同类型的bean) ,
会自动按照byName的方式注入;
byType:
Sat注入的方式自动注入
在Spring容器中根据属性的类型查找接口所有的实现类;
并用set注入的方式注入依赖对象
如果存在多个该类型的bean(id名称),就会报错(运行时报错)
(即 接口有多个实现类被 Spring 同时管理,也会报错,同样是运行时报错)
如果没有存在该类型的bean,就不会注入任何东西;
byName:
set注入的方式自动注入
在Spring容器中根据属性的名称(id="名称")查询对应的bean
找到则用set注入的方式注入依赖对象;
如果没有找到与servlce 层属性名相同的的bean(找id名),将不注入任何东西;
default:
父级标签的定义注入
采用父级标签(即beans的 default-autowire属性)的配置
default-autowire=“default/”
通过bean类的自省机制(introspection)
来决定是使用 constructor 还是byType 的方式进行自动装配
如果发现默认的构造器,那么将使用 byType 方式;
no:
关闭自动注入