一、Sping理解
Spring 是个java企业级应用的开源开发框架。Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用。Spring 框架目标是简化Java企业级应用开发,并通过POJO为基础的编程模型促进良好的编程习惯。
为什么要使用Spring?原因很简单,Spring有很多特点:
轻量: Spring 是轻量的,基本的版本大约2MB。
控制反转: Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。
面向切面的编程(AOP): Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。
容器: Spring 包含并管理应用中对象的生命周期和配置。
MVC框架:Spring的WEB框架是个精心设计的框架,是Web框架的一个很好的替代品。
事务管理: Spring 提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务
二、SpringIOC(DI)控制反转(依赖注入)
2.1IOC理解
IOC呢,也就是控制反转,它的核心思想就是把对象的管理权交给了容器,那么,应用程序如果需要使用某个对象的实例,就可以直接从IOC容器里获取了
2.2创建过程
2.2.1新建Maven项目
2.2.2添加porm依赖
<!--Spring依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
刷新porm
2.2.3新建User类
package com.demo.enity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private int id;
private String name;
private String birth;
}
2.2.4新建Spring配置文件
在resources中添加
添加之后点击右上角将文件设置为应用程序的上下文文件
2.2.5注入User对象信息
<?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 name="user" class="com.demo.enity.User">
<property name="id" value="001"></property>
<property name="name" value="张三"></property>
<property name="birth" value="1999-12-12"></property>
</bean>
</beans>
2.2.6创建测试类进行测试
import com.demo.enity.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
//解析beans.xml配置文件,将配置好的bean对象交给ioc容器管理
//创建ioc容器
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
//从IOC容器中获取User对象
User u = (User) context.getBean("user");
System.out.println(u);
}
}
2.2.7引用数据类型的调整
假如我在User中添加引用数据类型Data的话
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 name="user" class="com.demo.enity.User">
<property name="id" value="001"></property>
<property name="name" value="张三"></property>
<property name="birth" ref="date_ref"></property>
</bean>
<bean id="date_ref" class="java.util.Date"></bean>
</beans>
运行后
2.3SpringIOC进阶
2.3.1相关注解
@Component
用于创建对象的注解
相当于:<bean id="" class="">
作用: 把资源让 spring 来管理。相当于在 xml 中配置一个 bean。 属性: value:指定 bean 的 id。如果不指定 value 属性,默认 bean 的 id 是当前类的类名。首字母小写。
代码演示
import org.springframework.stereotype.Component;
@Component
//@Component("hello")
//相当于在beans中写入了<bean id="userDao" class="com.demo02.dao.UserDao"/>
public class UserDao {
public void select(){
System.out.println("我是xxx,我喜欢xxx");
}
}
@Component(“hello”)可以将<bean>标签中的id重命名为hello
@Component的衍生注解
除了上面使用到的Component注解外还有几个常用的注解:
@Component: 用于任意类的注入
@Repository: 用于标识在dao类上
@Service: 用于标识在Service类上
@Controller: 用于标识在控制器类上
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"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!-- 扫描注解类 -->
<context:component-scan base-package="com"/>
</beans>
<context:component-scan base-package="com"/>扫描注解类,可以扫描com包下的所有注解
@Autowired
用于注入数据的注解
代码演示
package com.demo02.service;
import com.demo02.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
@Service
//与@Component功能相同,这里只是区分各功能作用
@Scope("prototype")
public class UserService {
@Autowired//按照类型去ioc里面找对象,如果存在类型相同的bean,则会按照名称查找
//@Resource按照对象的名称去 ioc容器中获取对象
private UserDao userDao;
public void select(){
userDao.select();
}
}
@Scope
用于指定bean的作用范围,属性value:指定方位的取值,常用的取值singleton(单例)、 prototype(多例)和生命周期相关,他们的作用就和在bean标签中使用init-method和destroy-methode的作用是一样的
修改service代码
package com.demo02.service;
import com.demo02.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
@Service
//与@Component功能相同,这里只是区分各功能左右
@Scope("prototype")
public class UserService {
@Autowired//按照类型去ioc里面找对象,如果存在类型相同的bean,则会按照名称查找
//@Resource按照对象的名称去 ioc容器中获取对象
private UserDao userDao;
public void select(){
userDao.select();
}
}
修改测试类代码
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Scope;
public class Test {
@Scope("prototype")
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(configuration.class);
UserService us1 = (UserService) context.getBean("userService");
UserService us2 = (UserService) context.getBean("userService");
System.out.println(us1);
System.out.println(us2);
}
}
运行结果
三、Spring5的新注解
spring的核心配置文件除了可以用xml之外还可以使用一个java类来代替xml配置文件。如果要使用java类做为核心配置类,需要使用特定的注解,这些注解是在spring 5的版本中新加的
3.1@Configuration
作用:用于指定当前类是一个 spring 配置类,当创建容器时会从该类上加载注解。获取容器时需要使用AnnotationApplicationContext(有@Configuration 注解的类.class)。
3.2@ComponentScan
1.用于指定 spring 在初始化容器时要扫描的包。作用和在 spring 的 xml 配置文件中的:
2.<context:component-scan base-package="com "/>是一样的
3.属性: basePackages:用于指定要扫描的包。和该注解中的 value 属性作用一样
4.语法:@ComponentScan(basePackages = {"要扫描的包名1","要扫描的包名2",...})
3.3综合练习
删除beans.xml文件
因为我们可以通过@configuration注解将类配置成我们的Spring配置类,所以我们不需要beans.xml文件来配置spring了,让代码更加优雅
configuration类
package com.demo02.configuration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan({"com"})
public class configuration {
}
Dao层配置
package com.demo02.dao;
import org.springframework.stereotype.Component;
@Component
//@Component("hello")
//相当于在beans中写入了<bean id="userDao" class="com.demo02.dao.UserDao"/>
public class UserDao {
public void select(){
System.out.println("我是xxx,我喜欢xxx");
}
}
Service层
package com.demo02.service;
import com.demo02.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
@Service
//与@Component功能相同,这里只是区分各功能左右
@Scope("prototype")
public class UserService {
@Autowired//按照类型去ioc里面找对象,如果存在类型相同的bean,则会按照名称查找
//@Resource按照对象的名称去 ioc容器中获取对象
private UserDao userDao;
public void select(){
userDao.select();
}
}
测试类
package com.demo02;
import com.demo02.configuration.configuration;
import com.demo02.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Scope;
public class Test {
@Scope("prototype")
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(configuration.class);
UserService us1 = (UserService) context.getBean("userService");
us1.select();
}
}
运行结果
运行结束