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表达式
1.2第二步:添加junit依赖12 <!--junit--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope></dependency>
1.3第三步:定义beann:Userpackage com.powernode.spring6.bean;/** * bean,用户信息封装。 */public class User {}
1.4第四步:编写spring配置文件:beans.xml。该文件放置在类别的根路径下。上图是用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第五步:编写测试程序12package 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第六步:运行测试程序122.第一个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>
测试结果
通过测试,id不能在spring的配置文件中重名。
2.2底层是如何创建对象的,是否通过反射机制调用无参数结构?package com.powernode.spring6.bean;/** * bean,用户信息封装。 */public class User { public User() { System.out.println(实施User的无参数结构方法); }}
将无参数结构方法添加到User类中,如上。
操作测试程序:
通过测试了解到,在创建对象时,确实调用了无参数结构方法。
若提供有参数结构的方法,不提供无参数结构的方法会怎样?
package com.powernode.spring6.bean;/** * bean,用户信息封装。 */public class User { /*public User() { System.out.println(实施User的无参数结构方法); }*/ public User(String name){ System.out.println(实施User的参数结构方法); }}
通过测试,我们知道spring是通过调用无参数结构来创建对象的,所以如果你想让spring为你创建对象,你必须确保存在无参数结构方法。
2.3Spring是如何创建对象的?原理是什么?// dom4j分析beanss.xml文件,class的全限定类名/// Classs通过反射机制调用无参数结构方法创建对象 clazz = Class.forName("com.powernode.spring6.bean.User");Object obj = clazz.newInstance();
2.4将创建对象存储在什么样的数据结构中?2.5像这样的beans.能有多个xml文件吗?13可以
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);
2.6getBean()调用方法时,如果指定的id不存在会发生什么?14直接报错
2.7getBean()方法返回的类型是Object。如果您访问子类的独特属性和方法,您还需要向下转换。还有其他方法可以解决这个问题吗?14User 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); }
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); }
2.10注意:当调用getbean()方法创建对象并执行以下代码时,不会实例化对象。14new ClassPathXmlApplicationContext(spring6.xml");
3.Spring6启用Log4j2日志框架15Spring5之后,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(“我是错误的信息”); }
5.代码汇总com.powernode.spring6.beanUserpackage 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){ }}
Vippackage com.powernode.spring6.bean;/** * bean 13 **/public class Vip {}
com.powernode.spring6.daoUserDaoImplForMySQLpackage com.powernode.spring6.dao;/** * bean 12 **/public class UserDaoImplForMySQL { public void insert(){ System.out.println(mysql正在保存用户信息); }}
test中com.powernode.spring6.testFirstSpringTestpackage 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>