什么是Spring框架
1.Spring框架是一个轻量级的JavaEE框架
2.Spring框架可以解决企业级应用开发的复杂性,它也是现在的主流框架
3.Spring设计理念 是面向Bean的编程
4.Spring框架可以帮我们实现new对象
5.Spring框架可以帮我们维护对象和对象之间的关系
Spring 所需要的jar包
<?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>org.example</groupId>
<artifactId>springDemo1</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.0.11.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.0.11.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.9</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>1.8.9</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.7.4</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
</dependency>
</dependencies>
</project>
Spring的两个核心分别是什么
1.IOC
IOC主要用于控制反转,把创建对象的过程交给Spring进行一个管理,
2.Aop
Aop是切面 通过将这些横切关注点从核心业务逻辑中剥离出来,形成独立的切面(Aspect)
可以不修改源码 进行功能的增强
Spring IoC有什么优点
1.松耦合
通过IOC容器对对象之间的依赖关系进行一个管理,对象无需自行创建和管理其他依赖对象,使代码更加灵活,可维护性更高
2.可测试性
通过IOC容器管理对象的生命周期和依赖关系,这样在测试时候更容易替换依赖对象,提高代码可重用性
3.配置灵活
Spring采用xml结尾的配置文件来描述对象之间的关系,这样可以根据不同的需求进行配置和调整,无需要修改代码,提高代码的灵活性
4.提高开发效率
Spring IOC可以自动完成对象创建,依赖注入和管理等工作,大大减少开发人的工作量,提高开发效率
5.支持AOP
Spring IOC容器与Aop面向切面紧密集成,可以实现横切关注点处理,提高代码的结构性和可维护性
Spring具有哪一些特点
1.方便解耦,简化开发
2.方便和其他框架进行整合
3.可以面向切面编程(增加代码时不影响源码)
4.控制反转(当我们需要某一个对象时候,不用直接创建它,而是通过容器获取)
5.注入依赖(将对象所需要的依赖从外部注入进来,注入依赖也是实现控制反转的一种手段)
依赖注入实现的方式
何为依赖?何为注入?
依赖: a对象何b对象的关系
注入:注入式一种手段,通过这种手段,可以让a对象和b对象产生一种关系
总的来说依赖注入就是对象a和对象b对象的关系,是靠注入的手段来维护的,其中包括set注入和构造函数的注入后面还会有注解注入
1.构造实现注入(执行构造方法给属性赋的值)
userDao接口
public interface UserDao {
int add(User user);
}
-----------------------------------------------------------------------------------------
userDaoImpl接口实现类(此处省略了新增的具体代码)
@Repository
public class UserDaoImpl implements UserDao {
@Override
public int add(User user) {
System.out.println("新增成功!");
return 0;
}
}
-----------------------------------------------------------------------------------------
ApplicationContext.xml配置文件
解析:1.id="UserDao" 此处的名字可以随意取
2.class代表要实现所对应的包名
<!--构造注入-->
<bean id="UserDao" class="dao.UserDaoImpl.UserDaoImpl"></bean>
<bean id="UserService" class="service.UserServiceImpl.UserServiceImpl">
<!-- 注入dao-->
<constructor-arg ref="UserDao"></constructor-arg> <!--此处的ref指定的是上面的id-->
</bean>
-----------------------------------------------------------------------------------------
测试类
public class TestConstructor {
public static void main(String[] args) {
ApplicationContext user=new ClassPathXmlApplicationContext("ApplicationContext.xml");//获取要注入的配置文件的路径名
UserService service=(UserService)user.getBean("UserService");
service.add(new User());
}
2.set get 实现注入(执行set方法属性赋值)
使用的实体类
public class student {
private String name;
private String word;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getWord() {
return word;
}
public void setWord(String word) {
this.word = word;
}
}
-----------------------------------------------------------------------------------------
ApplicationContext.xml配置文件
<!--使用get set实现-->
<bean id="say" class="pojo.student">
<property name="name" value="张三"></property>
<property name="word" value="成为一颗最闪亮的星星"></property>
</bean>
-----------------------------------------------------------------------------------------
测试类
public class TestSay {
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("ApplicationContext.xml");
student say = (student) context.getBean("say");
System.out.println( say.getName()+say.getWord());
}
}
Spring IoC依赖注入的步骤
1.引入Spring的相关jar包
2.创建对话类,定义对话方法
3.编写Spring 配置文件
4.获取bean实例,调用功能方法
什么是面向切面编程
面向切面编程指从系统分离出切面,独立于业务逻辑实现,而程序执行时织入程序中来运行
通俗讲就是在原有的代码上增强功能 不会被之前的功能的源码所影响
面向切面编程AOP相关术语
1.Aspect(切面)
2.Advice(增强处理)
3.Pointcut(切入点)
4.Join Point(连接点)
5.Target Object(目标对象)
6.AOP proxy(AOP 代理)
7.Weaving(织入)
切面类
/**
* 切面类
*/
@Aspect
public class MyAspect {
/**
* 前置增强
*/
//1.切入点 (给谁增强 通过反射模式 全路径名)
//*代表包名(任意包名都可以 ..*代表忽略包名下的名字 .*代表包名下的所有方法)
@Before("execution(* service..*.*(..))")
public void before(){
System.out.println("前置通知.....在方法之前要执行的公共代码");
}
/**
* 后置增强
* returnVal 切点方法执行后的返回值
*/
@AfterReturning(value = "execution(* service..*.*(..))",returning = "returnVal")
//Object returnValue:与注解中的returnValue名字一致
public void afterReturning(Object returnVal){
System.out.println("后置通知....."+returnVal);
}
/**
* 环绕通知
* @param joinPoint 可用于执行切点得类
* @return
* @throws Throwable
*/
@Around("execution(* service..*.*(..))")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("环绕通知前.....");
Object obj =(Object) joinPoint.proceed();
System.out.println("环绕通知后.....");
return obj;
}
/**
* 抛出通知
*/
@AfterThrowing(value = "execution(* service..*.*(..))",throwing = "e")
public void afterThrowable(Throwable e){
System.out.println("出现异常:msg="+e.getMessage());
}
/**
* 无论如何都会执行的方法
*/
@After(value = "execution(* service..*.*(..))")
public void after(){
System.out.println("最终通知.....");
}
}