spring-Autowired

使用spring时添加核心依赖

在pom.xml里添加

在maven的dependencise里会出现

image-20240225135352942

实体类People

实体类Cat

实体类Dog

@Autowired注解

@Autowired可以自动装配,就无需set方法,需要在变量上面写上@Autowired

也不用再用beans.xml里进行一个一个的引用,但是需要在头部添加xml 完整的xml如下:

创建MyTest.java

@Test注解

需要在pom.xml里添加依赖

在需要运行的Java方法上面写上@Test可以简便的运行当前方法,从而不运行整个程序,如上面的MyTest.java中的test1()

@Nullable注解

使用@Nullable注解,说明这个字段可以为null值

例如:在有参构造器的参数前加上@Nullable,此时可以使name的值为null值

@Qualifier注解

使用@Qualifier注解,@Autowired和@Qualifier为一套需要搭配使用,如果beans.xml中有两个相同的对象例如

如上有两个Cat对象分别为cat222和cat2此时People类会报错,这个时候可以在People实体类中添加@Qualifier注解配合@Autowired注解指定唯一的bean对象,这样就不会报错了,但是需要类型一样。

@Resource注解

如果不想使用@Autowired和@Qualifier可以使用Java自带注解@Resource

使用@Resource需要在pom.xml里添加annotation依赖

在成员变量上加上@Resource

@Resource会先比较是否有相同的id,如果id都不一样,那么会比较class最后的类型例如com.yang.pojo.Cat

会寻找是否为pojo后面的Cat类型

当有两个id不同但相同类型的bean时,可以给@Resource添加name属性

注意:自动装配 现在基本都用@Autowired搭配@Qualifier基本不用@Resource

自动装配总结

@Autowired :自动装配先通过类型查找,再通过名字查找 如果Autowired不能唯一自动装配上属性,则需要通过@Qualifier(value="xxx")进行bean id的指定 @Nullable字段标记了这个注解,说明这个字段可以为null; @Resource: 自动装配先通过名字查找,再通过类型查找

*使用注解一定要导入AOP的包,如果导入了spring的核心springframework默认包含了AOP的依赖包,其次增加beans.xml里的context约束

@Component注解

使用@Component注解进行开发,@Component就相当于图中第3处的作用

image-20240225152113803

@Value注解

上图中4处的值也可以使用@Value进行赋值

@Value("小杨")可以放在public String name;上面,如果提供set方法也可以放在set方法上面进行赋值。

@Repository注解

@Service注解

@Controller注解

@Component有几个衍生注解,我们在web开发中,会按照mvc三层架构分层!,以下的@Repository @Service @Controller与@Component功能都是等价的,只不过分层不同,都是代表将某个类注册到Spring中,装配Bean dao 层使用 @Repository service层使用 @Service controller层使用 @Controller

因此@Component注解处的图第2处扫描改成com.yang这样dao service controller pojo就都能被扫描到了

@Scope注解

@Scope注解有两个常用属性

singleton:单例模式,只会创建一个bean对象

prototype:原型模式,会创建多个bean对象

@Configuration注解

@Bean注解

@Import注解

使用@Configuration可以完全摒弃xml配置文件使用纯Java的配置方式,这种方式在springboot中随处可见,例子如下

User.java实体类

config.java配置文件

config2.java配置文件

MyTest.java测试类文件

参考图:

image-20240225163611022

spring-代理模式

image-20240225173602726

静态代理

角色分析:

代理模式的好处:

代理模式的缺点:

 

例如租房 Rent(租房接口) Proxy(代理/中介) Host(房东/出租房屋的人) Client(顾客/租房的人)

步骤:

  1. 接口

  2. 真实角色

  3. 代理角色

     

  4. 客户端访问代理角色

    租房系统图如下:

image-20240225180631598

 

AOP的实现机制

image-20240225185106376

AOP面向切面编程,即程序纵向运行,增加功能但不改变原有代码,改为横向运行,即为AOP的实现机制,以下为一个例子:

例如使用代理模式在不改变原有代码的基础上增加日志输出功能

原有代码:

UserService接口

UserServiceImpl.java实现类

Client.java测试类

输出结果增加了一个用户

如果想要不改变原有代码在每次输出时加上”使用了xxx方法“,那么需要创建一个代理类,同样实现UserService的接口

修改后代码:

UserServiceProxy.java

修改Client.java

 

动态代理

解决静态代理每增加一个真实角色就会产生一个代理角色的缺点

InvocationHandler

动态代理万能模板

ProxyInvocationHandler.java

UserService接口

UserServiceImpl.java

Client.java

 

Spring实现AOP

需要在pom.xml中导入依赖包

方式一:使用Spring的API接口,以添加日志为例子

applicationContext.xml

UserService接口 service文件夹

UserServiceImpl.java service文件夹

Log.java log文件夹 MethodBeforeAdvice在程序执行之前添加日志

AfterLog.java log文件夹,AfterReturningAdvice为在程序最后添加日志

方式二:自定义类实现AOP

上述实例去掉Log文件夹及内文件

修改applicationContext.xml

创建diy文件夹并创建

DiyPointCut.java

其余文件不动,即可实现第二种自定义类实现AOP

方式三:使用Spring注解实现AOP

applicationContext.xml 导入aop的约束

xmlns:aop="http://www.springframework.org/schema/aop"

xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"

UserService.java接口

UserServiceImpl.java实现类

AnnotationPointCut.java切面类 注意:导包要导aspectj下面的

@Aspect注解

标注这个类是一个切面

@Before注解

方法执行前

@After注解

方法执行后

@Around注解

环绕方法

MyTest.java

程序执行结果:

环绕前 =====方法执行前===== 增加了一个用户 =====方法执行后===== 环绕后

整合mybatis

使用mybatis的步骤

  1. 编写实体类
  2. 编写核心配置文件
  3. 编写接口
  4. 编写Mapper.xml
  5. 测试

mybatis核心配置文件

mybatis-config.xml