Spring

一 . IoC

控制反转,将对象的创建进行反转,常规情况下,对象都是开发者手动创建的,使用IoC开发者不再需要创建对象,而是由IoC容器根据需求自动创建所需要的对象

不用IoC:所有对象由开发者自己创建

使用IoC:对象不用开发者创建,而是交给Spring框架来完成

环境配置 pom.xml

  1. <dependency> <!--IoC环境引入-->
  2. <groupId>org.springframework</groupId>
  3. <artifactId>spring-context</artifactId>
  4. <version>5.1.9.RELEASE</version>
  5. </dependency>
  6. <dependency> <!--lombok 自动生成set get方法以及构造器 java类中@Data调用-->
  7. <groupId>org.projectlombok</groupId>
  8. <artifactId>lombok</artifactId>
  9. <version>1.18.8</version>
  10. <scope>provided</scope>
  11. </dependency>

用IoC创建对象 通过spring.xml来管理创建对象 需要定义实体类

1.XML文件

  1. 基于XML:开发者把需要创建的对象在XML中进行配置,Spring框架读取这个配置文件,根据配置文件的内容来创建对象

spring.xml

  1. <bean id="student" class="wwjDemo.Student">
  2. <property name="id" value="1"></property>
  3. <property name="age" value="10"></property>
  4. <property name="name" value="傲世宗师"></property>
  5. <property name="addresses">
  6. <list>
  7. <ref bean="address"></ref>
  8. <ref bean="address2"></ref>
  9. </list>
  10. </property>
  11. </bean>

Student类

  1. @Data
  2. public class Student {
  3. private long id;
  4. private String name;
  5. private int age;
  6. private List<Address> addresses;
  7. }

main函数

加载配置文件 调用bean

  1. ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");//读取XML配置IoC容器
  2. Student student=(Student) applicationContext.getBean("student1");//获取XML中的 Bean
  3. System.out.println(sucker);

输出界面

2.注解方法

配置文件 BeanConfiguration

  1. 用一个java类来代替XML文件,把在XML中配置的内容放到配置类中,在Java类中添加@Configuration注解
  1. @Configuration //
  2. public class BeanConfiguration {
  3. @Bean(value = "翼豹")//提供一个Id 等同于 name="翼豹"
  4. public Car car(){
  5. Car car = new Car();
  6. car.setId(1L);
  7. car.setName("SUBARU WRX STI");
  8. return car;
  9. }
  10. }

实体类Car

  1. @Data
  2. //实体类
  3. public class Car {
  4. private long id;
  5. private String name;
  6. }

调用IoC中的bean使用context.getBean方法

  1. ApplicationContext context = new AnnotationConfigApplicationContext(BeanConfiguration.class);//配置文件
  2. System.out.println(context.getBean("翼豹");

与调用XML文件配置的不同之处在于AnnotationConfigApplicationContext();

  1. ApplicationContext context = new AnnotationConfigApplicationContext(.class)

输出界面

3.扫包+注解

  1. 更简单的方式 ,不再需要依赖于XML文件或者配置类,而是直接将bean的创建交给目标类,在目标类添加注解来创建,通过添加@Component来告知spring框架,当前类是需要注入IoC

“注解”

@Component告知spring框架当前类需要注入IoC

@Value() 赋值

  1. package wwj.apex.ioc;
  2. import lombok.Data;
  3. import org.springframework.beans.factory.annotation.Value;
  4. import org.springframework.stereotype.Component;
  5. @Data
  6. @Component("fxxk")
  7. public class DataConfig {
  8. @Value("localhost:3306")
  9. private String url;
  10. @Value("Driver")
  11. private String driverName;
  12. @Value("wwj")
  13. private String username;
  14. @Value("123456")
  15. private String password;
  16. }

“扫包”

注入IoC容器后开始扫包,依次遍历所选包中的类,有关键注解@Component的包就注入IoC AnnotationConfigApplicationContext(“wwj.apex.ioc”);

  1. public class test4 {
  2. public static void main(String[] args) {
  3. ApplicationContext context =new AnnotationConfigApplicationContext("wwj.apex.ioc");
  4. System.out.println(context.getBean(DataConfig.class));
  5. }
  6. }

自动装载

@Autowired通过类型(byType)进行注入,

如果需要通过名称(byName)取值需要使用@Qualifier(“xx”) ,完成名称的映射

  1. @Component
  2. @Data
  3. public class GlobalConfig {
  4. @Value("8080")
  5. private String port;
  6. @Value("/")
  7. private String path;
  8. @Autowired //自动装载
  9. @Qualifier("fxxk")
  10. private DataConfig sb;
  11. }

二. AOP

面向切面编程,是一种抽象化的面向对象编程,对面向对象编程的一种补充

/打印日志:业务代码和打印日志耦合

计算机方法中,日志和业务代码混合在一起,AOP就是将二者解耦合,将日志代码抽象出来,统一进行处理,计算机房中只保留核心业务代码.

做到核心业务和非业务代码的解耦合

1.创建切面类

@Aspect

方法执行之前使用

@Before(“execution(public int wwj.apex.aop.CalImpl.*(..))”)

方法执行完成之后使用

@AfterReturning(value = “execution(public int wwj.apex.aop.CalImpl.*(..))”,returning = “result”)

  1. @Component//
  2. @Aspect
  3. public class LoggerAspect {
  4. @Before("execution(public int wwj.apex.aop.CalImpl.*(..))") //方法执行之前
  5. public void before(JoinPoint joinPoint){
  6. String name = joinPoint.getSignature().getName();
  7. System.out.println(name+"add方法的参数是"+ Arrays.toString(joinPoint.getArgs()));
  8. }
  9. @AfterReturning(value = "execution(public int wwj.apex.aop.CalImpl.*(..))",returning = "result")
  10. //方法执行完成之后 , 拿不到返回值
  11. public void afterReturning(JoinPoint joinPoint,Object result){
  12. String name =joinPoint.getSignature().getName();
  13. System.out.println(name + "方法的结果是"+result);
  14. }
  15. }
  1. @Component/
  2. public class CalImpl implements Cal {
  3. public int add(int num1, int num2) {
  4. int result = num1 + num2;
  5. return result;
  6. }
  7. public int sub(int num1, int num2) {
  8. int result = num1 - num2;
  9. return result;
  10. }
  11. public int mul(int num1, int num2) {
  12. int result = num1 * num2;
  13. return result;
  14. }
  15. public int div(int num1, int num2) {
  16. int result = num1 / num2;
  17. return result;
  18. }
  19. }
  1. public interface Cal {
  2. public int add(int num1,int num2);
  3. public int sub(int num1,int num2);
  4. public int mul(int num1,int num2);
  5. public int div(int num1,int num2);
  6. }

2.配置自动扫包,开启自动生成代理对象

springaop.xml

  1. <!-- 自动扫包-->
  2. <context:component-scan base-package="wwj.apex.aop"></context:component-scan>
  3. <!-- 开启自动生成代理-->
  4. <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

3.使用

首先还是需要调用IoC自动扫包

  1. public class test {
  2. public static void main(String[] args) {
  3. ApplicationContext context = new ClassPathXmlApplicationContext("springaop.xml");
  4. Cal bean = context.getBean(Cal.class);
  5. System.out.println(bean.add(1,2));
  6. System.out.println(bean.sub(3,1));
  7. System.out.println(bean.mul(8,2));
  8. System.out.println(bean.div(4,2));
  9. }
  10. }

1