欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring5-02-IOC

程序员文章站 2022-07-15 10:23:46
...

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());
    }


相关标签: spring 5

上一篇: HelloSpring

下一篇: set注入

推荐阅读