Spring5-02-IOC
1.原来的步骤:
userDao接口 -userDaoIMPL实现类 userService业务接口 -userDaoIMPL业务实现
Spring_projecct–spring-01-ioc
在我们原来的业务中 用户的需求可能会影响我们原来的代码 我们需要根据用户的需求去修改源代码 如果程序赛马量十分大 修改一次的成本很高
2.我们使用一个set接口实现
在userserviceimpl中:
private UserDao userDao;
// 右键generation-
//利用set进行动态实现值的注入!
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
在test测试类中:
((UserServiceIMPL)userService).setUserDao(new UserDaoMysqlIMPL());
一开始的时候 在userserviceimpl中是写死的:
//private UserDao userDao = new UserDaoIMPL();
现在是 private UserDao userDao;
利用set进行动态实现值的注入public void setUserDao
3.控制反转 依赖注入
控制反转:
!!之前程序是主动创建对象 控制权在程序员手上
使用了set注入后 程序不再具有主动性 而是变成了被动的接受对象!
这种思想 从本质上解决了问题 我们程序员不再去管理对象的创建了
系统的耦合性大大降低 可以更加专注在业务的实现上!!这是IOC的原型
DI(依赖注入)是实现IOC(控制反转)的一种方法
控制反转是一种通过描述(XML或注解)
并通过第三方去生产或获取特定对象的方式
在Spring中实现控制反转的是IOC容器 其方法是依赖注入
4.applicationContext.xml基本配置
<?xml version="1.0" encoding="UTF-8"?>
<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
">
</beans>
5.所谓IOC 对象由Spring创建、 管理 、 装配
原来:Hello hello = new Hello();
Bean=对象 new Hello();
id变量名 class全路径 相当于你要new的对象
property相当于给对象中的属性设置一个值
反转:程序本身不创建对象 而变成被动的接受
依赖注入:利用set方法
所谓IOC 对象由Spring创建、 管理 、 装配
6.IOC创建对象的方式
1.使用无参构造创建对象!默认!
public User(){
System.out.println("User的无参构造");
}
<bean id="user" class="com.zhu.pojo.User">
<!--<property name="name" value="shirley"/>-->
</bean>
2.假设我们要使用有参构造创建对象 构造器注入
①下标赋值
<bean id="user" class="com.zhu.pojo.User">
<!--<property name="name" value="shirley"/>-->
<constructor-arg index="0" value="狂神说"/>
</bean>
②类型匹配 通过类型创建 不建议使用
<bean id="user" class="com.zhu.pojo.User">
<constructor-arg type="java.lang.String" value="QJ"/>
</bean>
③ 直接通过参数名
<bean id="user" class="com.zhu.pojo.User">
<constructor-arg name="name" value="qingjiang"/>
</bean>
总结:在配置文件加载的时候 容器中管理的对象就已经被初始化了
7.alias import
别名:如果使用了别名 我们也可以使用别名来获取到这个对象
<alias name="user" alias="auser"/>
bean的配置:
<!--此name也是别名 并且可以有多个 中间可以用空格 逗号 分号等隔开-->
<bean id="userT" class="com.zhu.pojo.UserT" name="user u2,u3;u4"/>
import:(合并!)
新建一个总的applicationContext.xml
可以在里面写:`
<import resource="beans.xml"/>
然后把之前写的beans.xml bean.xml等等汇总起来 调用这一个就可以使用所有的
内容相同 也可以被合并
8.依赖注入
1.构造器注入
①下标赋值
<bean id="user" class="com.zhu.pojo.User">
<!--<property name="name" value="shirley"/>-->
<constructor-arg index="0" value="狂神说"/>
</bean>
②类型匹配 通过类型创建 不建议使用
<bean id="user" class="com.zhu.pojo.User">
<constructor-arg type="java.lang.String" value="QJ"/>
</bean>
③ 直接通过参数名
<bean id="user" class="com.zhu.pojo.User">
<constructor-arg name="name" value="qingjiang"/>
</bean>
总结:在配置文件加载的时候 容器中管理的对象就已经被初始化了
2.set注入(重点!)
依赖:bean对象的创建依赖Spring容器
注入:Bean对象中的所有属性由容器注入
环境搭建:
(拓展:properties属性是键值对)
private String name;
private Address address; //另外的一个类
private String[] books;//数组
private List<String> hobbys;//list集合
private Map<String,String> card; //map集合
private Set<String> games; //set集合
private String wife; //空类型
private Properties info; //其他类型
根据不同类型的变量 创建不同的bean
<bean id="address" class="com.zhu.pojo.Address">
<property name="address" value="山东"/>
</bean>
<bean id="student" class="com.zhu.pojo.Student">
<property name="name" value="秦疆"/>
<property name="address" ref="address"/>
<property name="books">
<array>
<value>红楼梦</value>
<value>三国演义</value>
<value>水浒传</value>
<value>西游记</value>
</array>
</property>
<property name="hobbys">
<list>
<value>打游戏</value>
<value>听歌</value>
</list>
</property>
<property name="card">
<map>
<entry key="身份证" value="370305111122225555"/>
<entry key="银行卡号" value="415415546541654148"/>
</map>
</property>
<property name="games">
<set>
<value>LOL</value>
<value>COC</value>
</set>
</property>
<property name="wife">
<null/>
</property>
<property name="info">
<props>
<prop key="driver">2020200</prop>
<prop key="url">男</prop>
<prop key="username">root</prop>
<prop key="password">123456</prop>
</props>
</property>
9.p/c命名空间 :
p命名空间:
就是相当于里面的
首先:.xml头语句
xmlns:p=“http://www.springframework.org/schema/p”
然后这样使用:
<bean id="user" class="com.zhu.pojo.UserTest" p:name="shirley" p:age="21"/>
最后别忘了导包junit 测试用的@Test
c命名空间:就是相当于通过构造器注入 :construct-args
必须要在class类中加上有参方法
对应上述构造器注入
如果有c 有p 就要创建有参数、无参数
首先:.xml头语句
xmlns:c=“http://www.springframework.org/schema/c”
然后这样使用:
<bean id="user" class="com.zhu.pojo.UserTest" c:name="shirley" c:age="21"/>
10.bean的作用域
scope
1.单例模式(Spring默认机制)
<bean… scope=“singleton”/>
2.原型模式:每次从容器中get时候 都会产生一个新对象
<bean …scope=“prototype”/>
3.其余的request session application 这些只能在web开发中使用到
11.Bean的自动装配
是spring满足我们bean依赖的一种方式
Spring会在上下文中自动寻找 并自动给bean装配属性
1.在xml显示配置
2.在java显示配置
3.隐式的自动装配 重要!
ByName自动装配
一条狗一只猫一个人
xml
test
**byName:**会再容器上下文自动查找 和自己对象的set方法后面的值对应的beanid 主要看id
byType:会再容器上下文自动查找 和自己对象的属性类型相同的bean 因为只看class 所以id可以省略
使用注解
jdk1.5 spring2.5支持注解
1.倒入约束 context
2.配置注解支持 context:annotation..
<?xml version="1.0" encoding="UTF-8"?>
<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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
</beans>
@Autowired 自动装配 可以不用set方法 byname
如果@Autowired 自动装配的环境比较复杂 自动装配无法通过一个注解@Autowired完成的时候
我们可以使用@Qualifier(value=“XXX”)去配置@Autowired使用 指定唯一的bean对象注入
@Resource是java的注解 也是自动装配 不常用
12.使用注解开发
aop的包必须在 context约束
指定要扫描的包
<context:component-scan base-package="com.zhu.pojo"/>
@component
@Value(“shirley”)相当于中值的注入
衍生的注解
@Component 有几个衍生的注解 我们在wweb开发中 会按照mvc三层架构分层
dao[@Repository]本地仓库
service[@Service]
controller[@Controller]
这四个注解功能相同 就是代表将某个类注册到Spring中 装配bean
@scope
13.使用javaconfig来进行配置
–这种纯java的配置方式 在java中随处可见
实体类:pojo-user
@Component
//这里这个注解的意思 就是说这个类被spring接管了 注册倒容器中了
@Value("Shirley")
private String name;
配置类 config-myconfig
@Configuration
//因为他本身就是一个@compent 配置类
// 就是说这个类被spring接管了 注册倒容器中了
//注册这个bean 就相当于我们之前写的bean标签
//这个方法的名字 就相当于bean中的id
//这个方法的返回值 就相当于bean标签中的class属性
// <bean id="cat" class="com.zhu.pojo.Cat"/>
@Bean
public User getUser(){
return new User();
}
}
测试类:
public static void main(String[] args) {
//如果完全使用了配置类方式去做 我们就只能通过AnnotationConfig
//上下文来获取容器
ApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
User getUser = (User) context.getBean("getUser");
System.out.println(getUser.getName());
}
上一篇: HelloSpring
下一篇: set注入
推荐阅读