[JAVAEE]Spring

IoC :Inverse of Control 的简写,译为“控制反转”,指把创建对象过程交给 Spring 进行管理。

AOP:Aspect Oriented Programming 的简写,译为“面向切面编程”。AOP 用来封装多个类的公共行为,将那些与业务无关,却为业务模块所共同调用的逻辑封装起来,减少系统的重复代码,降低模块间的耦合度。另外,AOP 还解决一些系统层面上的问题,比如日志、事务、权限等。

控制反转依靠依赖注入(DI)实现,主要有两种形式:构造器注入,set方法注入。

其中默认使用无参构造器创建对象

下面给出一个实例

无参构造器创建对象

依赖配置pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>demo1</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>


        <dependencies>
            <!--spring context依赖-->
            <!--当你引入Spring Context依赖之后,表示将Spring的基础依赖引入了-->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>6.0.2</version>
            </dependency>

            <!--junit5测试-->
            <dependency>
                <groupId>org.junit.jupiter</groupId>
                <artifactId>junit-jupiter-api</artifactId>
                <version>5.3.1</version>
            </dependency>
        </dependencies>





</project>

bean.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">
<bean id="hiWorld" class="cn.amebob.HiCodeWorld"> </bean>
</beans>

测试类

public class TestForDemo1 {
    @Test
    public void HiCodeWorld(){
        ApplicationContext context = new ClassPathXmlApplicationContext("ioc.xml");
        HiCodeWorld helloWorld = (HiCodeWorld) context.getBean("hiWorld");

    }
}

实体类

public class HiCodeWorld {
    public HiCodeWorld() {
        System.out.println("Hello World!");
    }

}

可以看到构造器中的打印函数执行了。

测试结果

Spring读取bean.xml文件,借用反射机制创建对象,将对象放于map中

set注入

bean配置

    <bean id="studentOne" class="cn.amebob.Student">
        <!-- property标签:通过组件类的setXxx()方法给组件对象设置属性 -->
        <!-- name属性:指定属性名(这个属性名是getXxx()、setXxx()方法定义的,和成员变量无关) -->
        <!-- value属性:指定属性值 -->
        <property name="id" value="1001"></property>
        <property name="name" value="张三"></property>
        <property name="age" value="23"></property>
        <property name="sex" value="男"></property>
    </bean>

student类,这里并没有设置有参构造器

package cn.amebob;


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Student {
    private Logger logger = LoggerFactory.getLogger(Student.class);
    private Integer id;

    private String name;

    private Integer age;

    private String sex;

    public Student() {
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        logger.info(" ");
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        logger.info(" ");

        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
        logger.info(" ");

    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        logger.info(" ");

        this.sex = sex;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                '}';
    }

}
配置日志

测试方法

    @Test
    public void StudentSetTest(){
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-di.xml");
        Student student = (Student) context.getBean("studentOne");
        logger.info(student.toString());
    }
测试结果:set方法执行

构造器注入

Student类中的有参构造器(新加的)

  public Student(Integer id, String name, Integer age, String sex) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.sex = sex;
        logger.info("有参构造器执行");

    }

测试代码

    @Test
    public void StudentSetTest(){
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-di.xml");
        //测试set注入
        Student student = (Student) context.getBean("studentOne");
        logger.info(student.toString());
        //测试constructor注入
        Student student2 = (Student) context.getBean("studentTwo");
        logger.info(student2.toString());


    }

bean配置

    <bean id="studentTwo" class="cn.amebob.Student">
       
        <constructor-arg  value="1002"></constructor-arg>
        <constructor-arg  value="张三"></constructor-arg>
        <constructor-arg value="23"></constructor-arg>
        <constructor-arg  value="女"></constructor-arg>
    </bean>
测试结果

注入引用类型(对象引用)

仅展示一种方法,其他方法略(后续使用注解方式)

bean配置

测试代码

    Student student3 = (Student) context.getBean("studentThree");//注意这里,我们已将上图bean配置的studentFour改为studentThree
    logger.info(student3.toString());
测试结果

引入命名空间p(简化xml下赋值)

bean配置文件

<!--    引入p命名空间,简化xml方式为类属性赋值-->
    <bean id="studentFour" class="cn.amebob.Student"
          p:id="1004" p:name="小明" p:clazz-ref="clazzOne"></bean>
引入命名空间p

测试代码

    Student student4 = (Student) context.getBean("studentFour");
        logger.info(student4.toString());
测试结果

引入外部属性文件

这里的例子是引入基于xml配置的德鲁伊数据库连接池

从下图中可以看到,我们将数据库连接信息存放在jdbc.properties中,在bean配置文件中指明该文件(jdbc.properties)的位置(存放在类路径下,即resources文件夹下)。spirng将根据下面的bean配置创建一个druidDataSource实例,并注入相关配置

jdbc.properties

jdbc.user=root
jdbc.password=root
jdbc.url=jdbc:mysql://localhost:3306/demo1?serverTimezone=UTC
jdbc.driver=com.mysql.cj.jdbc.Driver

pom.xml

     <!-- MySQL驱动 -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.30</version>
            </dependency>

            <!-- 数据连接池-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.2.15</version>
            </dependency>

测试代码


    @Test
    public void testDataSource() throws SQLException {
        ApplicationContext ac = new ClassPathXmlApplicationContext("spring-di.xml");
        DataSource dataSource = ac.getBean(DataSource.class);
        Connection connection = dataSource.getConnection();
        System.out.println(connection);
    }
测试结果

beanscope

  <!-- scope属性:取值singleton(默认值),bean在IOC容器中只有一个实例,IOC容器初始化时创建对象 -->
    <!-- scope属性:取值prototype,bean在IOC容器中可以有多个实例,getBean()时创建对象 -->
    <bean class="cn.amebob.User" scope="prototype"></bean>

One thought on “[JAVAEE]Spring

Leave a Reply

Your email address will not be published. Required fields are marked *