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

Spring框架的配置文件开发

程序员文章站 2022-04-30 12:46:21
...

Spring框架的配置文件开发

1.入门案例

1.1 Maven坐标

<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.0.RELEASE</version>
</dependency>
<!-- Lombok jar包 -->
<dependency>
    <scope>compile</scope>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.16</version>
</dependency>
<!-- 单元测试jar包 -->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
</dependency>

1.2 JavaBean

public class Hello {

    private String str;

    //依赖注入的本质就是依靠set方法
    public void setStr(String str) {
        this.str = str;
    }

    @Override
    public String toString() {
        return "Hello{" +
                "str='" + str + '\'' +
                '}';
    }
}

1.3 SpringIOC配置文件

<?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">

    <!-- 使用spring创建对象,在spring中这些都称为bean -->
    <bean class="org.westos.pojo.Hello" id="hello">
        <property name="str" value="Spring"/>
    </bean>
</beans>

1.4 测试类

public class MyTest {
    public static void main(String[] args) {
        //获取spring的上下文对象
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("ApplicationContext.xml");
        Hello hello = (Hello) applicationContext.getBean("hello");
        System.out.println(hello.toString());
    }
}

1.5 运行结果

Spring框架的配置文件开发

2. Spring的依赖注入

2.1 set方法注入

<bean id="userT" class="org.westos.pojo.UserT" name="user2,u2">
    <property name="name" value="张无忌" />
</bean>

属性说明:

  1. id : bean 的唯一标识符 ,也相当于我们学过的对象名
  2. class : bean 对象所对应的全限定名
  3. name:也是别名,而且name可以同时取多个别名

2.2 构造器注入

共三种注入方式

  1. <!-- 第一种 采用参数名称注入,最常用的一种 -->
    <bean id="user" class="org.westos.pojo.User">
        <constructor-arg name="name" value="赵敏"/>
    </bean>
    
  2. <!--  第二种 采用下标赋值注入,当有多个同类型参数时可用,但代码可读性不强 -->
    <bean id="user" class="org.westos.pojo.User">
        <constructor-arg index="0" value="周芷若"/>
    </bean>
    
  3. <!-- 第三种 采用变量类型注入  不建议使用(若两个string类型的参数则会报错)-->
    <bean id="user" class="org.westos.pojo.User">
        <constructor-arg type="java.lang.String" value="蛛儿"/>
    </bean>
    

2.3 P名称空间注入(本质还是调set方法)

需要的约束文件:

<?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:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

</beans>

注入代码:

<bean id="user" class="org.westos.pojo.User" p:name="张三" p:age="24"/>

p名称空间注入,可以直接注入属性值。p : properties

2.4 C名称空间注入(本质还是调构造方法)

需要的约束文件:

<?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:c="http://www.springframework.org/schema/c"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

</beans>

注入代码:

<!-- 采用属性值相对位置索引进行注入 -->
<bean id="user2" class="org.westos.pojo.User" c:_0="李四" c:_1="23"/>
<!-- 采用属性值的名称进行注入 -->
<bean id="user3" class="org.westos.pojo.User" c:name="王五" c:age="25"/>

2.5 集合属性注入

JavaBean(实体类)

Student:

@Data//使用Lombok简化开发
public class Student {
    private String name;
    private Address address;
    private String[] books;
    private List<String> hobbys;
    private Map<String,String> card;
    private Set<String> games;
    private String wife;
    private Properties info;
}

Address:

@Data
public class Address {
    private String address;
}

SpringIOC配置文件

<?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">
    <bean id="addr" class="org.westos.pojo.Address">
        <property name="address" value="陕西省西安市"/>
    </bean>
    <bean class="org.westos.pojo.Student" id="student">
        <!-- 第1种,普通值注入 -->
        <property name="name" value="赵六"/>
        <!-- 第2种,Bean注入 -->
        <property name="address" ref="addr"/>
        <!-- 第3种,数组注入 -->
        <property name="books">
            <array>
                <value>红楼梦</value>
                <value>西游记</value>
                <value>水浒传</value>
                <value>三国演义</value>
            </array>
        </property>
        <!-- 第4种,list集合注入 -->
        <property name="hobbys">
            <list>
                <value>唱歌</value>
                <value>跳舞</value>
                <value>rap</value>
                <value>篮球</value>
            </list>
        </property>
        <!-- 第5种,Map注入 -->
        <property name="card">
            <map>
                <entry key="username" value="karen"/>
                <entry key="password" value="123456"/>
            </map>
        </property>
        <!-- 第6种,set注入 -->
        <property name="games">
            <set>
                <value>LOL</value>
                <value>DNF</value>
                <value>CF</value>
            </set>
        </property>
        <!-- 第7种,null注入 -->
        <property name="wife">
            <null/>
        </property>
        <!-- 第8种,properties注入 -->
        <property name="info">
            <props>
                <prop key="学号">05158888</prop>
            </props>
        </property>
    </bean>
</beans>

测试类

public class MyTest {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        Student student = context.getBean("student", Student.class);
        System.out.println(student);
    }
}

测试结果

Student(
    name=赵六, 
    address=Address(address=陕西省西安市), 
    books=[红楼梦, 西游记, 水浒传, 三国演义], 
    hobbys=[唱歌, 跳舞, rap, 篮球], 
    card={username=karen, password=123456}, 
    games=[LOL, DNF, CF], 
    wife=null, 
    info={学号=05158888}
)

3. Bean的作用域与生命周期

3.1 bean的作用域

类别 说明
singleton 默认值,单例。在Spring容器中仅存在一个Bean实例。
prototype 多例。每次从容器调用Bean时,都返回一个新的实例。
request WEB项目中,每次HTTP请求都会创建一个新的Bean的实例,存入到request域中
session WEB项目中,每次HTTP请求都会创建一个新的Bean的实例,存入到session域中
global session WEB项目中,应用在Portlet环境.如果没有Portlet环境那么globalSession相当于session

3.2 bean的作用范围和生命周期

  • 单例对象:scope=“singleton”

    • 一个应用只有一个对象的实例。它的作用范围就是整个引用。
    • 生命周期:
      • 对象出生:当应用加载,创建容器时,对象就被创建了。
      • 对象活着:只要容器在,对象一直活着。
      • 对象死亡:当应用卸载,销毁容器时,对象就被销毁了。
  • 多例对象:scope=“prototype”

    • 每次访问对象时,都会重新创建对象实例。
    • 生命周期:
      • 对象出生:当使用对象时,创建新的对象实例。
      • 对象活着:只要对象在使用中,就一直活着。
      • 对象死亡:当对象长时间不用时,被java的垃圾回收器回收了。
  • 单例对象:scope=“singleton”

    • 一个应用只有一个对象的实例。它的作用范围就是整个引用。
    • 生命周期:
      • 对象出生:当应用加载,创建容器时,对象就被创建了。
      • 对象活着:只要容器在,对象一直活着。
      • 对象死亡:当应用卸载,销毁容器时,对象就被销毁了。
  • 多例对象:scope=“prototype”

    • 每次访问对象时,都会重新创建对象实例。
    • 生命周期:
      • 对象出生:当使用对象时,创建新的对象实例。
      • 对象活着:只要对象在使用中,就一直活着。
      • 对象死亡:当对象长时间不用时,被java的垃圾回收器回收了。