2021-11-14Spring-IOC

wuchangjian2021-11-15 17:09:04编程学习

Spring

导入依赖

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
  <version>5.3.13</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-jdbc</artifactId>
  <version>5.3.13</version>
</dependency>

优点

spring是一个开源的免费的框架(容器)
spring是一个轻量级的、非入侵式的框架
控制反转(IOC),面向切面编程(AOP)
支持事务的处理,对框架整合的支持

在这里插入图片描述
springboot
一个快速开发的脚手架
基于springboot可以快速的开发单个微服务
约定大于配置
springcloud
基于springboot实现的

弊端:发展了太久之后,违背了原来的理念,配置十分繁琐

IOC控制反转理论

IOC就是对象由spring创建管理
之前的业务中用户的需求 可能会影响我们原来的代码 因为我们需要根据用户的需求来修改代码 程序是主动创建对象,控制权在程序员手里
之后,我们使用一个Set接口实现 程序不再具有主动性,而是变成了被动的接受对象!

public class UserServiceImpl implements UserService{
    private UserDao userDao ;


    //利用set进行动态实现值的注入
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    @Override
    public void getUser() {
         userDao.getUser();
    }
}

控制反转是一种通过描述(xml或注解)并通过第三方去生产或获取特定对象的方式。在spring中实现控制反转的是IOC容器,其实现方法是依赖注入

在这里插入图片描述
beans,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
        https://www.springframework.org/schema/beans/spring-beans.xsd">

<!--    使用spring来创建对象-->
       <bean id="hello" class="com.zxw.pojo.Hello">
           <property name="str" value="Spring"/>
       </bean>
</beans>

在这里插入图片描述
测试

public class MyTest {

    public static void main(String[] args) {
        //获取spring的上下文对象 ApplicationContext
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); //通过XML方式获取       
         //我们的对象现在都在spring容器中管理了,我们要使用,直接取出来就可以了
        Hello hello = (Hello) context.getBean("hello");
        System.out.println(hello.toString());

    }

IOC创建对象的方式

1.默认使用无参构造器创建对象
2.若使用有参构造器创建对象 :可以使用如下
1.下标赋值

<!--      下标赋值构造器-->
       <bean id="hello" class="com.zxw.pojo.Hello">
           <constructor-arg index="0" value="zxw"></constructor-arg>
       </bean>

2.参数类型
不推荐使用 当有多个同类型的参数要传递时,无法分辨

<bean id="hello" class="com.zxw.pojo.Hello">
           <constructor-arg type="java.lang.String" value="zxw"></constructor-arg>
           <property name="str" value="Spring"/>
       </bean>

3.参数名

<!--      直接通过参数名创建-->
       <bean id="hello" class="com.zxw.pojo.Hello">
           <constructor-arg name="s" value="zxw"></constructor-arg>
       </bean>

在配置文件加载的时候,容器中管理的对象就已经初始化了

Sprint配置

applicationContext.xml

alias 别名

配置别名后 通过别名也可获取到对象

 <alias name="hello" alias="hello2"></alias>

bean的配置

id bean的唯一标识符 对象名
class bean 对象所对应的全限定名: 包名+类型
name 别名,name更高级 可以同时取多个别名 可用逗号空格分号分割

       <bean id="hello" class="com.zxw.pojo.Hello" name="hello3,u2">
           <constructor-arg name="s" value="zxw"></constructor-arg>
       </bean>

import

一般用于团队开发使用,他可以将多个配置文Joan,导入合并为一个
在总的配置文件中导入子配置文件,导入后所有子配置文件中的配置 总配置文件都可用

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");


 <import resource="beans.xml"></import>

依赖注入

依赖:bean对象的创建依赖于容器
注入:bean对象中的所有属性,由容器来注入

1.构造器注入

见 IOC创建对象的方式

2.set方式注入 重点

依赖注入
环境搭建
1.复杂类型
public class Address {
private String address;

public String getAddress() {
    return address;
}

public void setAddress(String address) {
    this.address = address;
}

}
2.真实测试对象
private String name;
private Address address;
private String[] books;
private List hobbys;
private Map<String,String> card;
private Set games;
private String wife;
private Properties info;
3.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
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="student" class="com.zxw.pojo.Student">
      <property name="name" value="张馨文"></property>
    </bean>
    <import resource="beans.xml"></import>

</beans>

4.测试

<?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
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="address" class="com.zxw.pojo.Address"></bean>
    <bean id="student" class="com.zxw.pojo.Student">
<!--        第一种注入 普通值注入 name value-->
      <property name="name" value="张馨文"></property>
<!--        第二种注入 bean注入 name ref-->
      <property name="address" ref="address"></property>
<!--       数组注入 -->
      <property name="books">
          <array >
              <value>红楼梦</value>
              <value>西游记</value>
              <value>三国演义</value>
          </array>
      </property>
<!--        list注入-->
      <property name="hobbys">
          <list>
              <value>听歌</value>
              <value>写代码</value>
          </list>
      </property>
        <!--          map注入-->
        <property name="card">
            <map>
                <entry key="身份证" value="1111111111111111111"></entry>
                <entry key="银行卡" value="22222222222222222"></entry>
            </map>
        </property>
<!--        set注入-->
        <property name="games">
            <set>
                <value>LOL</value>
                <value>COC</value>
                <value>BOB</value>
            </set>
        </property>
<!--       null值注入-->
<!--        <property name="wife" value=""/>-->
        <property name="wife">
            <null/>
        </property>
<!--        properties注入-->
        <property name="info">
            <props>
                <prop key="学好">202009070155</prop>
                <prop key="性别">男</prop>
            </props>
        </property>
    </bean>
    <import resource="beans.xml"></import>
</beans>

3.拓展方式注入
p命名空间注入,可以直接注入属性的值:property

 xmlns:p="http://www.springframework.org/schema/p"
<bean id="user" class="com.zxw.pojo.Hello" p:str="zxw">
    </bean>

c命名空间注入通过构造器注入 constructor

 xmlns:c="http://www.springframework.org/schema/c"
  <bean id="user" class="com.zxw.pojo.Hello" p:str="zxw" c:s="zxw">

    </bean>

注意点 p命名和c命名不能直接使用,需要导入xml约束

相关文章

产品经验谈:阿里B2B电商-新零售产地供应链的思考与实践

产品经验谈:阿里B2B电商-新零售产地供应链的思考与实践

前言 产地供应链是新零售中的关键一环,源头好商好厂通全球已经实践一年多,本次分享将讲述...

不使用excel插件直接下载excel文件

$data为要下载的有表头的二维数组 header("Accept-Range...

c语言小游戏之加载数字(并且计算出加载所用时间)

废话不说先上源码! #include<stdio.h> #i...

困牛放牧(Sleepy Cow Herding)

题目描述 FJ的三头奶牛:Bessie,Elsie,和Mildred总是...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。