wei_shuo的个人主页

wei_shuo的学习社区

Hello World !


文章目录

  • ☢Spring框架
  • ☢Spring架构图
    • 组件介绍:
      • 核心容器(IOC)
      • 面向切面编程模块(AOP)
      • 数据访问模块(Data Access/Integration)
      • Web模块(Web)
      • 单元测试模块(Test)
      • 思维转变(传统开发—>IOC容器)
  • ☢Spring IOC/DI
    • 第一个Spring程序
    • Spring配置说明
    • import
    • IOC创建对象方式
    • DI依赖注入
      • 完整注入信息
    • Bean作用域
    • Bean自动装配(Autowire)
    • Spring框架xml配置中属性 ref 与 value的区别

☢Spring框架

Spring框架是由于<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> <bean id=hello class=com.wei.pojo.Hello> <property name=name value=Spring/> </bean></beans>

  • 编写测试类
import com.wei.pojo.Hello;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class MyTest {    public static void main(String[] args) {        //解析beans.xml文件,生成管理相应的Bean对象        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");        //getBean:参数即为Spring配置文件中的bean的id        Hello hello = (Hello) context.getBean("hello");     //强制类型转换        hello.show();    }}

总结:

  • bean就是Java对象,由Spring创建和管理
<bean id="hello" class="com.wei.pojo.Hello">        <property name="name" value="Spring"/>    </bean>
  • 解析beans.xml文件,生成管理相应的Bean对象
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
  • getBean:参数即为Spring配置文件中的bean的id
 Hello hello = (Hello) context.getBean("hello");     //强制类型转换

Spring配置说明

  • id:bean的唯一标识符,也就是相当于对象名
  • class:bean对象所对应的全限定名:包名.类型
  • name:别名
<bean id="hello" class="com.wei.pojo.Hello">        <property name="name" value="Spring"/>    </bean>

import

  • import,一般用于团队开发中,可以将多个配置文件导入合并为一个
  • 将所有xml文件导入到applicationContext.xml中,方法如下
<import resource="beans1.xml"/><import resource="beans2.xml"/><import resource="beans3.xml"/>

IOC创建对象方式

无参构造(默认)

  • 默认使用无参构造创建对象
    public User(){        System.out.println("User的无参构造");    }
    <bean id="user" class="com.wei.pojo.User"><property name="name" value="秦疆"/>-->    </bean>

带参构造

  • 第一种方法:下标赋值
    public User(String name){        this.name=name;    }
    <bean id="user" class="com.wei.pojo.User">        <constructor-arg index="0" value="wei_shuo"/>    </bean>
  • 第二种方法:类型创建
    public User(String name){        this.name=name;    }
    <bean id="user" class="com.wei.pojo.User">        <constructor-arg type="java.lang.String" value="秦疆"/>    </bean>
  • 第三种方法:参数名称
    public User(String name){        this.name=name;    }
    <bean id="user" class="com.wei.pojo.User">        <constructor-arg name="name" value="秦疆"/>    </bean>

DI依赖注入

依赖:bean对象的创建依赖于容器

注入:bean对象中的所有属性,容器注入

  • 构造器注入

    即无参构造/带参构造注入

  • Set注入

//复杂类型public class Address {    private String address;    public String getAddress() {        return address;    }    public void setAddress(String address) {        this.address = address;    }    @Override    public String toString() {        return "Address{" +                "address='" + address + '\'' +                '}';    }}
//真实测试对象public class Student {    private String name;    private Address address;    private String[] books;    private List<String> hobbys;    private Map<String,String> card;    private Set<String> game;    private String wife;    private Properties info;    //以及set/get方法  toString实现方法 此处省略}
   <bean id="student" class="com.wei.pojo.Student">                <property name="name" value="秦疆"/>    </bean>

完整注入信息

  • Studnet类
public class Student {    private String name;    private Address address;    private String[] books;    private List<String> hobbys;    private Map<String,String> card;    private Set<String> game;    private String wife;    private Properties info;    //以及set/get方法  toString实现方法 此处省略}
  • Address类
    private String address;    public String getAddress() {        return address;    }    public void setAddress(String address) {        this.address = address;    }    @Override    public String toString() {        return "Address{" +                "address='" + address + '\'' +                '}';    }
  • beans.xml配置
  <bean id="address" class="com.wei.pojo.Address">        <property name="address" value="武汉"/>    </bean>    <bean id="student" class="com.wei.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>                <value>听书</value>            </list>        </property>                <property name="card">            <map>                <entry key="学生编号" value="123"/>                <entry key="书籍编号" value="456"/>            </map>        </property>                <property name="game">            <set>                <value>英雄联盟</value>                <value>Apex</value>            </set>        </property>                <property name="wife">            <null/>        </property>                <property name="info">            <props>                <prop key="学号">2000</prop>                <prop key="性别"></prop>                <prop key="姓名">小明</prop>            </props>        </property>    </bean>
  • 测试类
public class MyTest {    public static void main(String[] args) {        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");        Student student = (Student) context.getBean("student");        System.out.println(student.toString());    }}/*输出结果:Student{name='秦疆', address=Address{address='武汉'}, books=[红楼梦, 西游记, 水浒传, 三国演义], hobbys=[听音乐, 看电影, 听书], card={学生编号=123, 书籍编号=456}, game=[英雄联盟, Apex], wife='null', info={学号=2000, 性别=男, 姓名=小明}}*/

Bean作用域

  • singleton 单实例(单例)(默认) —-全局有且仅有一个实例
<bean id="user2" class="com.wei.pojo.User" c:name="wei_shuo" c:age="18" scope="singleton"/>
  • prototype 多实例(多例) —- 每次获取Bean的时候会有一个新的实例
 <bean id="user2" class="com.wei.pojo.User" c:name="wei_shuo" c:age="18" scope="prototype"/>

以下在web开发中使用

  • request
  • session
  • application
  • websocket

Bean自动装配(Autowire)

自动装配是Spring满足bean依赖的方式,Spring会在上下文中自动寻找,自动给bean装配属性

  • xml中显示装配
  • Java中显示配置
  • 隐式自动装配bean

案例实现:

  • 一个人(people)有两个宠物(dog/cat)
  • 狗实现方法wang
  • 猫实现方法mioa
  • Dog类
public class Dog {    public void shout(){        System.out.println("wang");    }}
  • Cat类
public class Cat {    public void shout(){        System.out.println("miao");    }}
  • people类
public class People {    private Cat cat;    private Dog dog;    private String name;    /*    get/set方法     toString方法    需要写,笔者为了不影响文章美观此处省略……    */ }
  • beans.xml
    • byName:会自动在容器上下文中查找,和自己对象set方法后面的值(dog/cat)对应的beanid,如果beanid满足则自动装配
    • byType:会自动在容器上下文中查找,和自己对象属性类型相同的bean,如果类型全局唯一满足则自动装配
        <bean id="cat" class="com.wei.pojo.Cat"/>    <bean id="dog" class="com.wei.pojo.Dog"/>        <bean id="people" class="com.wei.pojo.People" autowire="byName"><!--    autowire="byType 根据对象属性类型自动装配-->        <property name="name" value="wei_shuo"/>        <!----><!---->    </bean>

Spring框架xml配置中属性 ref 与 value的区别

  • 属性 ref :对象引用类型,代表引用这个对象
  • 属性 value:字符串引用类型,代表引入的这个对象名字的字符串

结语:创作不易,如果觉得博主的文章赏心悦目,还请——点赞收藏⭐️评论冲冲冲