Spring框架 - DI
-
一、依赖注入(DI)的四种方式
1. set注入(常用)
必须存在setter方法, 声明变量
通过<property>标签注入, 可以注入对象也可以注入基本数据类型;
<!-- set注入 -->
<bean id="userDao" class="com.lwx.dao.UserDao"></bean>
<bean id="userService" class="com.lwx.service.UserService">
<property name="userDao" ref="userDao"></property>
<property name="name" value="刘文旭"></property>
<property name="age" value="18"></property>
</bean>
2. 构造器注入
通过<constructor-arg>标签注入, 必须存在有参构造!
可以注入对象和基本数据类型!
同时可以通过name或者index指定注入顺序
<!-- 构造器注入 -->
<!-- index可以写成name属性,两种不同实现方式 -->
<bean id="userService2" class="com.lwx.service.UserService2">
<constructor-arg index="0" ref="userDao"></constructor-arg>
<constructor-arg index="1" value="lwx" />
<constructor-arg index="2" value="20"/>
</bean>
3. 静态工厂注入
<!-- 静态工厂注入 -->
<bean id="staticDao" class="com.lwx.factory.StaticFactory" factory-method="creatStaticDao"></bean>
<bean id="staticService" class="com.lwx.service.StaticService">
<constructor-arg index="0" ref="staticDao"/>
<constructor-arg index="1" value="zhangsan"/>
<constructor-arg index="2" value="88"/>
</bean>
4. 实例工厂注入
只是对注入bean的实例产生方式不同的定义!
<!-- 实例工厂注入 -->
<bean id="instanceFactory" class="com.lwx.factory.InstanceFactory"></bean>
<bean id="instanceDao" factory-bean="instanceFactory" factory-method="creatInstanceDao"></bean>
<bean id="instanceService" class="com.lwx.service.InstanceService">
<constructor-arg ref="instanceDao"/>
</bean>
5. p标签和c标签
简化<property> 和 <constructor-arg>
xmlns:p="http://www.springframework.org/schema/p" xmlns:c="http://www.springframework.org/schema/c" |
<!-- p标签-->
<bean class="com.lwx.dao.UserDao" id="userDao"></bean>
<bean class="com.lwx.service.UserService" id="userService"
p:userDao-ref="userDao"
p:name="LLL"
p:age="99"
/>
<!-- c标签 -->
<bean class="com.lwx.dao.UserDao" id="userDao2"></bean>
<bean class="com.lwx.service.UserService2" id="userService2"
c:_0-ref="userDao2"
c:_1="kkk"
c:_2="555">
</bean>
6. 集合注入
List Map Set Properties
都是set方式下的
<!-- list集合注入 --> <property name="set">
|
-
二、注解注入
反射技术实现
1.@Autowired
spring框架提供的
默认通过类型查找
可以通过名称查找,配合@Qualifier使用
2.@Resources
JDK提供的
默认通过名字查找,然后通过类型
如果指定名称,找不到就报错
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'userDao1' available
过程
1.加入spring-aop jar 包spring-aop-4.3.2.RELEASE.jar
2.Xml 配置: 加入context 命名空间和xsd 地址
3. 添加<context:annotation-config/> 配置,否则
-
三、bean自动扫描
<context:component-scan base-package="com.lwx"/>
@Repository
标记Dao层
@Services
标记Service层
@Controller
标记Controller层
@Component
开发中不明确属于那一层,就是用component, 所以可以都是用
|
-
四、模拟用户登陆
流程:
传入参数(用户名和密码) -发送请求-> 接收参数 -> 检验参数 -> 数据库查询 -> 返回对象 -> 比对用户名密码是否一致 -> 返回结果
-
五、bean作用域
从spring 容器中拿到的对象均是单例的
1. singleton 单例 lazy-init 如果为true 就是懒加载,默认为false
2. prototype 原型(非单例)
scope = “prototype”
单例的好处:
1)提前发现潜在的配置问题
2)Bean 对象存在于缓存中,使用时不用再去实例化bean,加快程序运行效率
-
六、bean的生命周期
定义
通过配置文档的方式来定义Bean
初始化
I.在配置文档中通过指定init-method 属性来完成。
II.实现org.springframework.beans.factory.InitializingBean 接口
使用
I.使用BeanFactory
II.使用ApplicationContext
销毁
AbstractApplicationContext 对象
调用其close 方法
信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@64b8f8f4: startup date [Tue Oct 30 20:59:18 CST 2018]; root of context hierarchy