本文摘要:
1.IOC:创建对象的三种方式
2.DI :依赖注入的两种方式
3. 注解代替配置文件
@Repository
:dao层
@Service
:service层
@Controller
:web层
@Component
:Component层
@Resource
@Autowired
@qualifier("名称")
-------------------------Spring理论基础-----------------------------------
id,在整个ioc容器中bean的标识
class,具体要实例化的哪一个类scope,范围,作用域
constructor argument,构造器参数
property,成员变量
Autowiring mode,自动装配模式
lazy-initialization mode,懒加载模式
initialization/destruction method,初始化/销毁方法
Bean生命周期:定义——初始化——使用——销毁
一、初始化:方法1.实现org.springframework.beans.foctory.InitializingBean接口,覆盖afterPropertiesSet方法。系统会自动查找afterPropertiesSet方法,执行其中的初始化操作。
方法2.配置init-method
例如设置bean中init-method="init"那么在初始化过程中就会调用相应class指定类的init()方法进行初始化工作。
二、销毁(与初始化类似):
方法1.实现org.springframework.beans.foctory.DisposableBean接口,覆盖destory方法。
方法2.配置destory-method。
三、配置全局初始化、销毁方法(属于默认配置,参考截图)
注意:
1、当三种方式同时使用时,全局(默认的)初始化销毁方法会被覆盖。
2、另外实现接口的初始化/销毁方式会先于配置文件中的初始化/销毁方式执行,然后再执行配置的。//初始化(接口式)——初始化(<bean>标签配置)——销毁(接口式)——销毁(<bean>标签配置)
3、即使没有以上三种初始化方法也是可以编译执行。
4、如果配置全局初始化、销毁,但没有写对应方法,则可通过编译;如果在<bean>标签中配置初始化、销毁,但没有写对应方法,则报错。
当 bean 实现 Sping 中以 Aware 结尾的接口后,初始化可以获取相应资源
Bean 实现 ApplicationContextAware 接口
public void setApplicationContext(ApplicationContext applicationContext)
通过 applicationContext.getBean("xxx") 获取 bean
Bean 实现 BeanNameAware 接口
public void setBeanName(String name)
通过 this.beanName = name 获取 bean
---------------------------------------Spring操作之 IOC 控制反转--------------------------------------------------
Spring 容器创建对象的三种方式
前言:关于调用
//1、启动 spring 容器
ApplicationContext context =
new
ClassPathXmlApplicationContext(
"applicationContext.xml"
);
//2、从 spring 容器中取出数据
HelloIoc IOC = (HelloIoc) context.getBean(
"helloIoc"
);
//3、通过对象调用方法
IOC.sayHello();
1.利用默认的构造方法。
<bean id=
"唯一标识1"
class
=
"类全名"
></bean>
<!-- 别名属性 name:和bean的 id 属性对应 -->
<alias name=
"唯一标识1"
alias=
"别名"
/>
2.利用静态工厂方法。
①创建静态工厂类 HelloStaticFactory.java
1
2
3
4
5
6
7
8
9
10
11
12
|
package
com.ys.ioc;
public
class
HelloStaticFactory {
public
HelloStaticFactory(){
}
//静态工厂方法
public
static
HelloIoc getInstances(){
return
new
HelloIoc();
}
}
|
②applicationContext.xml 中进行如下配置:
1
2
|
<!--
factory-method:静态工厂类的获取对象的静态方法
class
:静态工厂类的全类名
-->
<bean id=
"helloStaticFactory"
factory-method=
"getInstances"
class
=
"com.ys.ioc.HelloStaticFactory"
></bean>
|
3.利用实例工厂方法。
①创建实例工厂类 HelloInstanceFactory .java
1
2
3
4
5
6
7
8
9
10
11
12
13
|
package
com.ys.ioc;
public
class
HelloInstanceFactory {
public
HelloInstanceFactory(){
}
//利用实例工厂方法创建对象
public
HelloIoc getInstance(){
HelloIoc instanceIoc =
new
HelloIoc();
return
instanceIoc;
}
}
|
接着在 applicationContext.xml 中进行如下配置:
1
2
3
4
5
6
7
8
|
<!--
factory-bean:指定当前Spring中包含工厂方法的beanID
factory-method:工厂方法名称
-->
<bean id=
"instanceFactory"
class
=
"com.ys.ioc.HelloInstanceFactory"
></bean>
<bean id=
"instance"
factory-bean=
"instanceFactory"
factory-method=
"getInstance"
></bean>
|
---------------------------------------Spring操作之 DI 依赖注入--------------------------------------------------
Spring 依赖注入的两种方式
1.利用set方法给属性注值。
① 创建实体类 Person
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
package
com.ys.di;
import
java.util.List;
import
java.util.Map;
import
java.util.Properties;
import
java.util.Set;
public
class
Person {
private
Long pid;
private
String pname;
private
Student students;
private
List lists;
private
Set sets;
private
Map maps;
private
Properties properties;
//此地是get、set方法
}
|
//我们看到这个实体类包括引用类型 Student 类,基本数据类以及集合数据类型。
②在 applicationContext.xml 中进行赋值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
<!--
property是用来描述一个类的属性
基本类型的封装类、String等需要值的类型用value赋值
引用类型用ref赋值
-->
<bean id=
"person"
class
=
"com.ys.di.Person"
>
<property name=
"pid"
value=
"1"
></property>
<property name=
"pname"
value=
"vae"
></property>
<property name=
"students"
>
<ref bean=
"student"
/>
</property>
<property name=
"lists"
>
<list>
<value>
1
</value>
<ref bean=
"student"
/>
<value>vae</value>
</list>
</property>
<property name=
"sets"
>
<set>
<value>
1
</value>
<ref bean=
"student"
/>
<value>vae</value>
</set>
</property>
<property name=
"maps"
>
<map>
<entry key=
"m1"
value=
"1"
></entry>
<entry key=
"m2"
>
<ref bean=
"student"
/>
</entry>
</map>
</property>
<property name=
"properties"
>
<props>
<prop key=
"p1"
>p1</prop>
<prop key=
"p2"
>p2</prop>
</props>
</property>
</bean>
<bean id=
"student"
class
=
"com.ys.di.Student"
></bean> //注意看看代码24行
|
2.利用 构造函数 给属性注值。
①在实体类 Per'son.java 中添加两个构造方法:有参和无参
1
2
3
4
5
6
7
|
//默认构造函数
public
Person(){}
//带参构造函数
public
Person(Long pid,Student students){
this
.pid = pid;
this
.students = students;
}
|
②:在 applicationContext.xml 中进行赋值
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<!-- 根据构造函数赋值 -->
<!--
index 代表参数的位置 从
0
开始计算
type 指的是参数的类型,在有多个构造函数时,可以用type来区分,要是能确定是那个构造函数,可以不用写type
value 给基本类型赋值
ref 给引用类型赋值
-->
<bean id=
"person_con"
class
=
"com.ys.di.Person"
>
<constructor-arg index=
"0"
type=
"java.lang.Long"
value=
"1"
>
</constructor-arg>
<constructor-arg index=
"1"
type=
"com.ys.di.Student"
ref=
"student_con"
></constructor-arg>
</bean>
<bean id=
"student_con"
class
=
"com.ys.di.Student"
></bean>
|
---------------------------------------Spring操作之 注解:DI 、IOC--------------------------------------------------
@Repository
:dao层
@Service
:service层
@Controller
:web层
@Component
:Component层
1.在 applicationContext.xml 中引入命名空间
注意:第一个 xmlns:context ,这表示标签格式应该是 <context:标签名>
2.在 applicationContext.xml 文件中引入注解扫描器
1
2
|
<!-- 组件扫描,扫描含有注解的类 -->
<context:component-scan base-
package
=
"含有注解类的包名"
></context:component-scan>
|
****@Resource : 用来消除 set ,get方法。
****@Autowired :功能和注解 @Resource 一样,可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。只不过注解 @Resource 是按照名称来进行装配,而@Autowired 则是按照类型来进行装配。
@Autowired
private
PersonDao personDao; //PersonDao可以是接口
那么问题来了,如果 PersonDao 的实现类有多个呢?
解决:方案一
解决:方案二
在使用@Autowired时,首先在容器中查询对应类型的bean
如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据
如果查询的结果不止一个,那么@Autowired会根据名称来查找。
如果查询的结果为空,那么会抛出异常。解决方法时,使用required=false