Spring框架为任何类型的部署平台上的基于Java的现代企业应用程序提供了全面的编程和配置模型。
Spring的一个关键元素是在应用程序级别的基础架构支持:Spring专注于企业应用程序的“管道”,以便团队可以专注于应用程序级别的业务逻辑,而不必与特定的部署环境建立不必要的联系。
总结: Spring的主要的作用将其他框架进行整合,以一种统一的通用的方法进行管理(“角色:框架的大管家”)
Spring框架是一个开放源代码的J2EE应用程序框架,由Rod Johnson发起,是针对bean的生命周期进行管理的轻量级容器(lightweight container)。 Spring解决了开发者在J2EE开发中遇到的许多常见的问题,提供了功能强大IOC、AOP及Web MVC等功能。Spring可以单独应用于构筑应用程序,也可以和Struts、Webwork、Tapestry等众多Web框架组合使用,并且可以与 Swing等桌面应用程序AP组合。因此, Spring不仅仅能应用于JEE应用程序之中,也可以应用于桌面应用程序以及小应用程序之中。Spring框架主要由七部分组成,分别是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 Spring Web MVC。
在大型项目中由于模块众多,如果将所有的项目都写到一起则代码特别的混乱.不便于后期的维护. 所以通过MVC设计模型,将代码进行分级.
实现步骤: 分为3级
传统的代码是直接通过new的方式创建对象. 这样的方式将对象与对象紧紧的绑定到一起,不便于代码的扩展.所以需要进行松耦合处理.
控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
将对象的创建的权利交给Spring管理, 由Spring(第三方)管理对象的生命周期(创建/初始化/使用/销毁).
2).检查path路径
检查环境变量中,有几个JDK 如果不确定,则将自己的JDK配置为第一项…
打包之后的结果:
3).本地仓库位置
坐标的主要作用就是用来检索jar包文件的. maven通过这样的方式管理了几乎所有的开源jar包.(中央仓库/私服镜像)
<groupId>com.jtgroupId>
<artifactId>spring_demo_1_iocartifactId>
<version>1.0-SNAPSHOTversion>
5).本地仓库中的jar包主要的作用就是被自己的项目进行依赖 (松耦合)
<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.0modelVersion>
<groupId>com.jtgroupId>
<artifactId>spring_demo_1_iocartifactId>
<version>1.0-SNAPSHOTversion>
<properties>
<maven.compiler.source>17maven.compiler.source>
<maven.compiler.target>17maven.compiler.target>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
properties>
<dependencies>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-coreartifactId>
<version>5.3.22version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-beansartifactId>
<version>5.3.22version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-contextartifactId>
<version>5.3.22version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-expressionartifactId>
<version>5.3.22version>
dependency>
<dependency>
<groupId>commons-logginggroupId>
<artifactId>commons-loggingartifactId>
<version>1.2version>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
dependency>
dependencies>
project>
<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="user" class="com.jt.pojo.User">bean>
beans>
package com.jt;
import com.jt.pojo.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestUser {
//测试方法返回值必须为void, 方法名不能是类名
@Test
public void testSpring01(){
//1.通过加载配置文件,创建Spring容器对象 容器创建对象创建
ApplicationContext context =
new ClassPathXmlApplicationContext("application.xml");
//2.从容器中获取对象 通过bean的Id获取对象
User user = (User) context.getBean("user");
/*User user2 = context.getBean(User.class);
User user3 = context.getBean("user",User.class);*/
//3.执行方法
user.say();
}
}
1).当Spring程序执行时,首先会根据配置文件的内容进行解析
2).当程序解析到bean标签时,则会根据反射的机制实例化对象
@Test
public void demo2() throws ClassNotFoundException, IllegalAccessException, InstantiationException {
//1.通过类的路径实例化类型...
Class userClass = Class.forName("com.jt.pojo.User");
//2.实例化对象
User user = (User) userClass.newInstance();
user.say();
}
3).将实例化好的对象保存到超大的Map集合中
Map
4). 从容器中获取对象. 则从Map集合中通过id获取对象即可.
User user = (User) context.getBean("user");
反射机制 必然调用对象的无参构造方法,所以特别注意!!!
public class User {
//反射机制调用时,必然调用对象的无参构造,所以写构造方法时必须先写无参构造
public User() {
System.out.println("我是一个无参构造");
}
public void say() {
System.out.println("您好Spring框架");
}
}
通过spring容器创建的对象一般是通过反射机制调用.但是有的时候由于业务需要需要实例化抽象类的对象/复杂的接口对象 Spring提供了工厂模式用于实例化复杂对象!!!
import java.util.Calendar;
public class StaticFactory {
//通过静态工厂获取数据
public static Calendar getCalendar() {
return Calendar.getInstance();
}
}
<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="calendar1" class="com.jt.factory.StaticFactory" factory-method="getCalendar"/>
beans>
@Test
public void testStatic(){
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
Calendar calendar1 = (Calendar) context.getBean("calendar1");
System.out.println("获取当前时间"+calendar1.getTime());
}
import java.util.Calendar;
public class InstanceFactory {
//获取Calendar对象
public Calendar getCalendar(){
return Calendar.getInstance();
}
}
<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="calendar1" class="com.jt.factory.StaticFactory" factory-method="getCalendar"/>
<bean id="instanceFactory" class="com.jt.factory.InstanceFactory">bean>
<bean id="calendar2" factory-bean="instanceFactory" factory-method="getCalendar">bean>
beans>
@Test
public void testInstance(){
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
Calendar calendar2 = (Calendar) context.getBean("calendar2");
System.out.println("获取当前时间"+calendar2.getTime());
}
如果需要创建复杂对象首选工厂模式
import org.springframework.beans.factory.FactoryBean;
import java.util.Calendar;
public class SpringFactory implements FactoryBean<Calendar> {
//工厂模式实例化对象的方法
@Override
public Calendar getObject() throws Exception {
return Calendar.getInstance();
}
//获取类型
@Override
public Class<?> getObjectType() {
return Calendar.class;
}
//默认条件下spring容器中都是单例对象 节省空间 单例对象 多例对象
//多线程问题 多例对象 ????? 安全性问题!
//多个资源对共享数据进行操作!!!!
//对象.方法() 没有安全性问题 提倡使用单例
@Override
public boolean isSingleton() {
return true;
}
}
<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="calendar1" class="com.jt.factory.StaticFactory" factory-method="getCalendar"/>
<bean id="instanceFactory" class="com.jt.factory.InstanceFactory">bean>
<bean id="calendar2" factory-bean="instanceFactory" factory-method="getCalendar">bean>
<bean id="calendar3" class="com.jt.factory.SpringFactory">bean>
beans>
@Test
public void testSpringFactory(){
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
Calendar calendar3 = (Calendar) context.getBean("calendar3");
System.out.println("获取当前时间"+calendar3.getTime());
}