目录
1.spring框架介绍
spring是开源Java软件框架,利用这套框架可以款速搭建Java软件。
可以简单理解为框架:框架是半成品软件组件。
具体表现来看,是一系列的jar包文件,普通的jar包只是工具包,而框架更多的是解决了某些特定的问题,比如开发效率问题,执行问题等。
在使用框架时,可能还需要遵循框架的特定方式来编程。
Spring框架有两个核心的功能,其他的组件也是基于这两个核心功能实现的:
1.1IOC/DI(控制反转依赖注入)
1.1.1IOC
(Inversion of Control)直接翻译“控制反转”:
1)主动控制:由应用程序主动控制管理“对象组件”。简单理解:对象的创建,管理都由自动亲手完成(适合管理创建过程简单的对象)。
2)控制反转:由外部容器环境(框架)创建管理“对象组件”交给应用程序使用。简单理解:将对象的创建,管理交给Spring容器去管理,自己只是使用(适合创建过程复杂的对象)。
创建一个spring测试程序:
1创建一个Maven项目
2.创建Demo类
package com.jt.demo;
public class Demo {
@Override
public String toString(){
return "hello spring";
}
}
3.在pom文件中添加依赖
<!--指定JDK的版本 -->
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<!-- 添加spring-context依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
</dependencies>
4.创建信息类config
package com.jt.congfig;
import com.jt.demo.Demo;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration //标识这是一个配置类
//这个类想作用就是通知Spring启动以后创建的对象
public class Congfig {
@Bean //告诉Spring在启动的时候,加载被@Bean标识的方法
//返回值是Sping创建的对象,方法名是Bean的ID,一般在项目中会有多个Bean,Spring会根据
//对应的方法名,找对应的Bean
public Demo textConfig(){
return new Demo();
}
}
5.利用测试类进行测试
package com.jt.textdemo;
import com.jt.demo.Demo;
import com.jt.congfig.Congfig;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Text {
public static void main(String[] args) {
//初始化spring容器
//AnnotationConfigApplicationContext 是spring官网提供的
AnnotationConfigApplicationContext applicationContext=
new AnnotationConfigApplicationContext(Congfig .class);
//获取spring创建对象
Demo demo = applicationContext.getBean("textConfig", Demo.class);
System.out.println(demo);
}
}
结果返回hello spring 则测试成功
1.1.2DI(后续详细介绍)
1.1.3Java Bean
Bean的英文意思是“豆子”
为了规范java类的定义,java提供Java Bean规范,所谓的JavaBean规范就是约定java类的定义规则,使程序规范一致,方便使用和交流。其约定如下:
1.需要定义包package
2.有无参构造器
3.需要实现序列化接口(序列化能把堆内存中的对象的声明周期延长,做持久化操作,当下次再需要这个对象的时候,我们不用new了,直接从硬盘中读取就可以了)
4.包含使用getXxx setXxx声明的“Bean属性”xxx
1)Bean属性(Bean Property)就是指getXxx setXxx的用法
2)对象属性(Object Filed)是指对象的实例化变量
spring与JavaBean
1.Spring建议被其管理的对象符合JavaBean规范,同时为了方便实用Spring也支持对不标准的Java对象进行管理
2.因为Spring管理的对象是JavaBean对象,所以也称Spring为JavaBean容器、Bean容器、Spring容器、IOC容器
案列:
package com.jt.demo;
import java.io.Serializable;
public class User implements Serializable {
private String name="zhangsan"; //实例变量,对象属性
public String getName() { //Bean属性 name
return name;
}
public void setName(String name) { //Bean属性 name
this.name = name;
}
public String getLastName(){ //Bean属性 lastName
return name.substring(0,1);
}
}
1.2AOP(面向切面编程)(后续详细介绍)
2.利用JUnit测试
2.1使用JUnit
1.导包
dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
2.测试
package com.jt;
import org.junit.Test;
public class TestHello {
@Test //单元测试
public void textHello(){
System.out.println("hello word!");
}
}
结果在控制台输出:hello word!
2.2利用JUnit测试Spring
测试Spring的时候需要Spring容器的代码冗长麻烦,利用Junit的@Before和@After注解声明方法,封装Spring的初始化和销毁方法,可以一劳永逸的解决Spring的初始化问题。
案列:
package com.jt.test;
import com.jt.config.ConfifDemo;
import com.jt.demo.Demo;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Text1 {
AnnotationConfigApplicationContext context ;
@Before
public void before(){
//初始化Spring容器
context = new AnnotationConfigApplicationContext(ConfifDemo.class);
System.out.println("spring销毁之前");
}
@After
public void after(){
context.close();//关闭
System.out.println("spring销毁之后");
}
@Test
public void testHello(){
// 第一个参数为Bean id ,第二个为类名.class
Demo demo = context.getBean("demoText", Demo.class);
System.out.println(demo);
}
}
控制台输出内容:
spring销毁之前
hello word!
spring销毁之后
3.组件扫描
3.1spring组件扫描功能
spring提供组件扫描注解,利用组件扫描注解和组件注解配合,可以自动扫描包空间自动创建Bean对象,减少编码,提高编程的效率
案列:
1.案例结构
2.提前准备的数据
package com.jt.bean;
import org.springframework.stereotype.Component;
//@Component
@Component("BeanDemo") //自己写Bean id 建议使用默认的Bean id 减少代码,进而降低出错率
public class BeanDemo01 {
@Override
public String toString() {
return "hello BeanDemo01";
}
}
3.编写配置类
package com.jt.config;
//import com.jt.demo.Demo;
//import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan(basePackages = "com.jt.bean")
public class Config {
// @Bean
// public Demo bean(){
// return new Demo();
// }
/**
* 写@ComponentScan注解,以上代码可以省略不写
*/
}
4.进行测试
package com.jt.test;
import com.jt.bean.BeanDemo01;
import com.jt.config.Config;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import java.io.Serializable;
public class TestDemo01 implements Serializable {
AnnotationConfigApplicationContext cgx;
@Before
public void before(){
System.out.println("bean创建之前");
//注意,此处传的参数为配置类的类名.class
cgx=new AnnotationConfigApplicationContext(Config.class);
}
@After
public void after(){
cgx.close();
System.out.println("bean被销毁了");
}
@Test
public void testBeanDemo(){
// Bean id
BeanDemo01 demo01 = cgx.getBean("BeanDemo", BeanDemo01.class);
System.out.println(demo01);
}
}
5.结果
bean创建之前
hello BeanDemo01
bean被销毁了
3.2Spring提供多种组件注解
Spring提供了多种组件注解,用于程序中不同用途的组件标注,这些注解名字不同但作用是相同的,包括:
@Controller 控制器组件
@Service 业务层组件
@Component 通用组件
3.3定义组件ID
在使用组件扫描功能的时候@Component注解可以添加属性,自定义组件的id
//@Component
@Component("BeanDemo") //自己写Bean id 建议使用默认的Bean id 减少代码,进而降低出错率