当前位置: 首页 > 图灵资讯 > 技术篇> 第一个spring程序

第一个spring程序

来源:图灵教育
时间:2023-06-01 09:46:36

1.创建步骤121.1第一步:添加springcontext依赖性,pom.xml配置如下12

<?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>com.powernode</groupId>    <artifactId>spring6-0001-first</artifactId>    <version>1.0-SNAPSHOT</version>    <packaging>jar</packaging>    <repositories>        <repository>            <id>repository.spring.milestone</id>            <name>Spring Milestone Repository</name>            <url>https://repo.spring.io/milestone</url>        </repository>    </repositories>    <dependencies>        <!--spring context依赖-->        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-context</artifactId>            <version>6.0.0-M2</version>        </dependency>    </dependencies>    <properties>        <maven.compiler.source>17</maven.compiler.source>        <maven.compiler.target>17</maven.compiler.target>    </properties></project>

注:jar的包装方式。

加入springcontext的依赖后,会引入其他依赖:

springaop:面向切面编程

springbeans:IoC核心

springcore:spring核心工具包

springjcl:spring日志包

springexpression:spring表达式

第一个spring程序_xml

1.2第二步:添加junit依赖12

 <!--junit-->        <dependency>            <groupId>junit</groupId>            <artifactId>junit</artifactId>            <version>4.13.2</version>            <scope>test</scope></dependency>

1.3第三步:定义beann:User

package com.powernode.spring6.bean;/** * bean,用户信息封装。  */public class User {}

1.4第四步:编写spring配置文件:beans.xml。该文件放置在类别的根路径下。

第一个spring程序_User_02

上图是用IDEA工具自带的spring配置文件模板创建的。

bean在配置文件中的配置

<?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="userBean" class="com.powernode.spring6.bean.User"/></beans>

bean的id和class属性:

ID属性:代表对象的唯一标志。可视为一个人的身份证号码。

class属性:用于指定要创建的java对象的类名,必须是全限定类名(带包名)。

1.5第五步:编写测试程序12

package com.powernode.spring6.test;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Spring6Test {    @Test    public void testFirst(){        // 上下文初始化Spring容器(分析beansns).xml文件,创建所有bean对象)        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");        // bean对象根据id获得        Object userBean = applicationContext.getBean("userBean");        System.out.println(userBean);    }}

1.6第六步:运行测试程序12

第一个spring程序_spring_03

2.第一个Spring程序能否详细分析132.1bean标签的id属性?

package com.powernode.spring6.bean;public class Vip {}

<?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="userBean" class="com.powernode.spring6.bean.User"/>    <bean id="userBean" class="com.powernode.spring6.bean.Vip"/></beans>

测试结果

第一个spring程序_xml_04

通过测试,id不能在spring的配置文件中重名。

2.2底层是如何创建对象的,是否通过反射机制调用无参数结构?

package com.powernode.spring6.bean;/** * bean,用户信息封装。 */public class User {    public User() {        System.out.println(实施User的无参数结构方法);    }}

将无参数结构方法添加到User类中,如上。

操作测试程序:

第一个spring程序_xml_05

通过测试了解到,在创建对象时,确实调用了无参数结构方法。

若提供有参数结构的方法,不提供无参数结构的方法会怎样?

package com.powernode.spring6.bean;/** * bean,用户信息封装。 */public class User {    /*public User() {        System.out.println(实施User的无参数结构方法);    }*/    public User(String name){        System.out.println(实施User的参数结构方法);    }}

第一个spring程序_xml_06

通过测试,我们知道spring是通过调用无参数结构来创建对象的,所以如果你想让spring为你创建对象,你必须确保存在无参数结构方法。

2.3Spring是如何创建对象的?原理是什么?

// dom4j分析beanss.xml文件,class的全限定类名/// Classs通过反射机制调用无参数结构方法创建对象 clazz = Class.forName("com.powernode.spring6.bean.User");Object obj = clazz.newInstance();

2.4将创建对象存储在什么样的数据结构中?

第一个spring程序_User_07

2.5像这样的beans.能有多个xml文件吗?13

可以

第一个spring程序_spring_08

2.6配置文件中配置的类必须自定义吗?JDK中的类可以使用吗?例如:java.util.Date?14

<!--配置java.util.Date Bean-->    <bean id="nowTime" class="java.util.Date"/>

Object nowTime = applicationContext.getBean("nowTime");        System.out.println(nowTime);

第一个spring程序_spring_09

2.6getBean()调用方法时,如果指定的id不存在会发生什么?14

直接报错

第一个spring程序_User_10

第一个spring程序_xml_11

2.7getBean()方法返回的类型是Object。如果您访问子类的独特属性和方法,您还需要向下转换。还有其他方法可以解决这个问题吗?14

User user = applicationContext.getBean("userBean", User.class);

2.8不是从类路径中加载spring.例如E盘14ml文件

///不是从类路径中加载spring.xml文件 比如E盘  14    @Test    public void testXmlPath(){        // FileSystemXmlApplicationContext 资源不是从类路径中加载的。        // 这种方法很少使用。了解即可。        ApplicationContext applicationContext = new FileSystemXmlApplicationContext("e:/spring6.xml");        User user = applicationContext.getBean("userBean", User.class);        System.out.println(user);    }

第一个spring程序_xml_12

2.9aplicationcontext超级父接口BeanFactory。14

//Applicationcontext超级父接口BeanFactory。  14    @Test    public void testBeanFactory(){        //Applicationcontext接口的超级父接口是:BeanFactory(翻译为Bean工厂        // ,是一个能够生产Bean对象的工厂对象。)        //BeanFactory是IOC容器的顶级接口。        ///SpringIOC容器底层实际使用:工厂模式。        //Spring底层的IOC是如何实现的?XML解析 + 工厂模式 + 反射机制        //ApplicationContext applicationContext = new ClassPathXmlApplicationContext(spring6.xml");        BeanFactory applicationContext = new ClassPathXmlApplicationContext(spring6.xml");        User user = applicationContext.getBean("userBean", User.class);        System.out.println(user);    }

第一个spring程序_spring_13

2.10注意:当调用getbean()方法创建对象并执行以下代码时,不会实例化对象。14

new ClassPathXmlApplicationContext(spring6.xml");

第一个spring程序_xml_14

3.Spring6启用Log4j2日志框架15

Spring5之后,Spring框架支持集成的日志框架是Log4j2。如何使用日志框架:

第一步:引入Log4j2的依赖

<!--依赖log4j2--><dependency>  <groupId>org.apache.logging.log4j</groupId>  <artifactId>log4j-core</artifactId>  <version>2.19.0</version></dependency><dependency>  <groupId>org.apache.logging.log4j</groupId>  <artifactId>log4j-slf4j2-impl</artifactId>  <version>2.19.0</version></dependency>

第二步:在类的根路径下提供log4j2.xml配置文件(文件名固定为log4j2.xml,文件必须放在类根路径下。)

<?xml version="1.0" encoding="UTF-8"?><configuration>    <loggers>        <!--            level指定日志级别,优先级从低到高:                ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF        -->        <root level="DEBUG">            <appender-ref ref="spring6log"/>        </root>    </loggers>    <appenders>        <!--输出日志信息到控制台-->        <console name="spring6log" target="SYSTEM_OUT">            <!--控制日志输出格式-->            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss SSS} [%t] %-3level %logger{1024} - %msg%n"/>        </console>    </appenders></configuration>

第三步:使用日志框架:

Logger logger = LoggerFactory.getLogger(FirstSpringTest.class);logger.info(“我是日志新闻”);

测试

//使用log4j2日志框架  15    @Test    public void testBeginInitBean(){        // 注:在调用getbean()方法时,不会创建对象,执行以下代码时,会实例化对象。        new ClassPathXmlApplicationContext(spring6.xml");        // 如何使用log4j2记录日志信息?        // 第一步:创建日志记录器对象        // 获取FirstSpringTest的日志记录器对象,也就是说,只要是FirstSpringTest类别        // 如果代码执行记录日志,则输出相关日志信息。        Logger logger = LoggerFactory.getLogger(FirstSpringTest.class);        // 第二步:记录日志,输出日志根据不同的级别输出        logger.info(“我是个消息”);        logger.debug(“我是调试信息”);        logger.error(“我是错误的信息”);    }

第一个spring程序_spring_15

5.代码汇总com.powernode.spring6.beanUser

package com.powernode.spring6.bean;/** * 这是包装用户信息的Bean。Spring能帮助我们创建User对象吗?  12 **/public class User {    // Spring是如何实例化对象的?    // 在默认情况下,Spring将通过反射机制调用类无参数结构方法来实例对象。    // 实现原理如下:    // Class clazz = Class.forName("com.powernode.spring6.bean.User");    // Object obj = clazz.newInstance();    public User() {        System.out.println(实施User的无参数结构方法。");    }    public User(String s){    }}

Vip

package com.powernode.spring6.bean;/** * bean    13 **/public class Vip {}

com.powernode.spring6.daoUserDaoImplForMySQL

package com.powernode.spring6.dao;/** * bean   12 **/public class UserDaoImplForMySQL {    public void insert(){        System.out.println(mysql正在保存用户信息);    }}

test中com.powernode.spring6.testFirstSpringTest

package com.powernode.spring6.test;import com.powernode.spring6.bean.User;import com.powernode.spring6.dao.UserDaoImplForMySQL;import org.junit.Test;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.BeanFactory;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import org.springframework.context.support.FileSystemXmlApplicationContext;import java.text.SimpleDateFormat;import java.util.Date;//测试程序  12public class FirstSpringTest {    //使用log4j2日志框架  15    @Test    public void testBeginInitBean(){        // 注:在调用getbean()方法时,不要创建对象,在执行以下代码时,将实例对象。        new ClassPathXmlApplicationContext(spring6.xml");        // 如何使用log4j2记录日志信息?        // 第一步:创建日志记录器对象        // 获取FirstSpringTest的日志记录器对象,也就是说,只要是FirstSpringTest类别        // 如果代码执行记录日志,则输出相关日志信息。        Logger logger = LoggerFactory.getLogger(FirstSpringTest.class);        // 第二步:记录日志,输出日志根据不同的级别输出        logger.info(“我是个消息”);        logger.debug(“我是调试信息”);        logger.error(“我是错误的信息”);    }    //Applicationcontext超级父接口BeanFactory。  14    @Test    public void testBeanFactory(){        //Applicationcontext接口的超级父接口是:BeanFactory(翻译为Bean工厂        // ,是一个能够生产Bean对象的工厂对象。)        //BeanFactory是物联网容器的顶级接口。        ///SpringIOC容器底层实际使用:工厂模式。        //Spring底层的IOC是如何实现的?XML解析 + 工厂模式 + 反射机制        //ApplicationContext applicationContext = new ClassPathXmlApplicationContext(spring6.xml");        BeanFactory applicationContext = new ClassPathXmlApplicationContext(spring6.xml");        User user = applicationContext.getBean("userBean", User.class);        System.out.println(user);    }    ///不是从类路径中加载spring.xml文件 比如E盘  14    @Test    public void testXmlPath(){        // FileSystemXmlApplicationContext 资源不是从类路径中加载的。        // 这种方法很少使用。        // 这种方法很少使用。了解一下。        ApplicationContext applicationContext = new FileSystemXmlApplicationContext("e:/spring6.xml");        User user = applicationContext.getBean("userBean", User.class);        System.out.println(user);    }    @Test    public  void testFirstSpringCode(){        // 第一步:获取Spring容器对象。        // ApplicationContext 翻译为:应用上下文。        // ApplicationContext 翻译为:应用上下文。其实是Spring容器。        // ApplicationContext 它是一个接口。        // ApplicationContext 接口下有许多实现类。其中一个实现类叫        // 做:ClassPathXmlApplicationContext        // ClassPathXmlApplicationContext Spring上下文对象专门从类路径中加载spring配置文件。        // 只要执行此行代码,就相当于启动Spring容器,分析Spring.xml文件和实例化        // 一些bean对象,放在spring容器中。        //ApplicationContext applicationContext = new ClassPathXmlApplicationContext(spring6.xml");        //ApplicationContext applicationContext = new ClassPathXmlApplicationContext(spring6.xml", "beans.xml");        ApplicationContext applicationContext = new ClassPathXmlApplicationContext(spring6.xml", "beans.xml", "xml/beans.xml");        // 第二步:根据bean的id从Spring容器中获取此对象。        Object userBean = applicationContext.getBean("userBean");        System.out.println(userBean);        //Object userDaoBean = applicationContext.getBean("userDaoBean");        UserDaoImplForMySQL userDaoBean = applicationContext.getBean("userDaoBean", UserDaoImplForMySQL.class);        System.out.println(userDaoBean);        userDaoBean.insert();        Object vipBean = applicationContext.getBean("vipBean");        System.out.println(vipBean);        Object userBean2 = applicationContext.getBean(userbean2);        System.out.println(userBean2);        //Object nowTime = applicationContext.getBean("nowTime");        //System.out.println(nowTime);        //Date nowTime = (Date) applicationContext.getBean("nowTime");        // 不想强制转换类型,可以使用以下代码(返回的bean类型可以通过第二个参数来指定。)  14        Date nowTime = applicationContext.getBean("nowTime", Date.class);        // 日期格式化        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");        String strNowTime = sdf.format(nowTime);        System.out.println(strNowTime);        // 假如bean的id不存在,它不会回到null,而是出现异常。        //Object nowTime = applicationContext.getBean(nowtime2);        // System.out.println(nowTime);    }}

spring6.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">    <!--这是Spring的配置文件   12-->    <!--这是Spring的配置文件   12-->    <!--IDEA工具为我们提供了这个文件的模板,必须使用这个模板来创建。-->    <!--这个文件名不一定叫spring.xml,可以是其他名字。-->    <!--本文件最好放在类路径中,便于后期移植。-->    <!--放在resources根目录下,相当于放在类的根路径下。-->    <!--配置bean,这样spring就可以帮助我们管理这个对象。-->    <!--        bean标签的两个重要属性:            id:是这个bean的身份证号码,不能重复,是唯一的标志。            class:全路径、全限定类名必须填写。(带包名的类名)    -->    <bean id="userBean" class="com.powernode.spring6.bean.User"/><!--    <bean id="userBean" class="com.powernode.spring6.bean.Vip"/>-->    <!--    配置其他bean-->    <bean id="userDaoBean" class="com.powernode.spring6.dao.UserDaoImplForMySQL"/>    <!--配置java.util.Date Bean-->    <bean id="nowTime" class="java.util.Date"/></beans>

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 http://www.springframework.org/schema/beans/spring-beans.xsd">    <bean id="vipBean" class="com.powernode.spring6.bean.Vip"/></beans>

resources目录下的xml目录

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 http://www.springframework.org/schema/beans/spring-beans.xsd">    <bean id=“userBean2” class="com.powernode.spring6.bean.User"/></beans>

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>com.powernode</groupId>    <artifactId>course4</artifactId>    <version>1.0-SNAPSHOT</version>    <!--jar,学习Spring,项目不能是web项目,普通java项目可以。--包装方式jar,学习Spring,项目不能是web项目,普通java项目可以。12-->    <packaging>jar</packaging>    <!--配置多个仓库  12-->    <repositories>        <!--仓库里程碑版spring-->        <repository>            <id>repository.spring.milestone</id>            <name>Spring Milestone Repository</name>            <url>https://repo.spring.io/milestone</url>        </repository>    </repositories>    <!--依赖-->    <dependencies>        <!--依赖-->    <dependencies>        <!--spring context依赖-->        <!--当你引入Spring时 Context依赖后,表示引入了Spring的基本依赖-->        <!--若要使用springjdbc,或其它tx,然后需要再次添加依赖依赖依赖-->        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-context</artifactId>            <version>6.0.0-M2</version>        </dependency>        <!--依赖junit-->        <dependency>            <groupId>junit</groupId>            <artifactId>junit</artifactId>            <version>4.13.2</version>            <scope>test</scope>        </dependency>        <!--依赖log4j2-->        <dependency>            <groupId>org.apache.logging.log4j</groupId>            <artifactId>log4j-core</artifactId>            <version>2.19.0</version>        </dependency>        <dependency>            <groupId>org.apache.logging.log4j</groupId>            <artifactId>log4j-slf4j2-impl</artifactId>            <version>2.19.0</version>        </dependency>    </dependencies>    <properties>        <maven.compiler.source>17</maven.compiler.source>        <maven.compiler.target>17</maven.compiler.target>    </properties></project>

log4j2.xml

<?xml version="1.0" encoding="UTF-8"?><configuration>    <loggers>        <!--            level指定日志级别,优先级从低到高:  15                ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF        -->        <root level="DEBUG">            <appender-ref ref="spring6log"/>        </root>    </loggers>    <appenders>        <!--输出日志信息到控制台-->        <console name="spring6log" target="SYSTEM_OUT">            <!--控制日志输出格式-->            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss SSS} [%t] %-3level %logger{1024} - %msg%n"/>        </console>    </appenders></configuration>