Spring ioc和Aop
IOC
在传统Java当中,我们的对象都需要new关键字来生成,这在面对很多对象的情况产生了不必要的麻烦,因为我不需要在一个项目中一直做重复的事情,那怎么办把,自然而然的一些好的框架就诞生了,避免我们去做这些重复的事情。
ioc就是控制反转,创建对象的容器,他是一种面向切面的编程,就比如你要重复做某些事情,你单纯把这件事情抽象出来,然后写出来,给我的感觉很像Lombok,加一个@Data这样子数据就不需要get,set方法,自动生成,这样子就看着很优雅了,有一种美感。
ioc容器加载有大体上有两种模式,一种基于xml,还有是基于注解,后者就具有普适性,越来越常用了,接下来就展示一下这两种方法
这两种方式的前提都要在pom.xml中配置好依赖,这是至关重要的一步
基于XML的方式
(现大多使用注解方式,xml方式并不简洁,本文仅记录xml用作了解)
resource目录下创建Spring的xml文件,名称无要求
文件最上头的几行为约束,表示可以用哪些标签等
在bean.xml文件中写bean标签:id为类的唯一标识,class为类的全类名(包名+类名)
ApplicationContext context=new ClassPathXmlApplication(spring.xml)
想获取文件里面的对象,三种方法,基于id,基于class,还有就是两个一起用
getBean(类名.class)或者getBean(id)都可以,但是值得注意两点:
当根据类型获取bean时,要求IoC容器中指定类型的bean有且只能有一个。
当IOC容器中一共配置了多个,根据类型获取时会抛出异常。
因为他不只要找谁。
基于注解的方式
(AnnotationConfigApplicationContext
+ @Configuration
)
创建一个类,给他加上@Configuration注解,给要创建的对象加上一个Bean注解(这里给以给定一个value/name值,这样子可以通过id查找,默认是方法名)
这里注意的是,当配置类很多的情况,我们可以直接传进去资源包,会通过扫包的形式,指定该包名即可,加载所有bean。
ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
public class AnnotationConfigApplicationContext extends GenericApplicationContext implements AnnotationConfigRegistry {...
}
都是基于ApplicationContext继承,看名字其实,确实很好,在以后大规模的时候就会知道他的优势,感觉越来越有趣了,哈哈哈
这里再补充一下,bean
什么是bean
可以这么说bean是计算机自动生成的类,Bean 是Spring框架中用于表示一个对象的术语,我感觉都挺对,但是和一般的对象不一样,他有他的规范:
- 这个Java类必须具有一个无参的构造函数
- 属性必须私有化。
- 私有化的属性必须通过public类型的方法暴露给其它程序,并且方法的命名也必须遵守一定的命名规范。
接下来介绍一些注解
@Component注解
作用是将一个 Java 类标识为 Spring 的组件(Bean) 注解可以用于标记任何一个普通的 Java 类,并将其纳入 Spring 管理
@value注解
直接赋值
@Value("localhost:8080")
String url;
@Autowired注解
装配,自动装配,不光能创建单个对象,还能完成对象之间的关系注入
@Data
@Component
public class DataConfig{
@Value("localhost:3306")
private Sting url;
@Value("Driver")
private Sting driverName;
@Value("root")
private Sting username;
@Value("root")
private Sting password;
}
@Data
@Component
public class GlobalConfig{
@Value("8080)
private String port
@Value("/")
private String path;
@Autowired
private DataConfig dataConfig;
}
有了这个注解,当ioc容器中存在这两个对象,就可以在全局中获取这个DataConfig,根据类型获取(byType),也可以根据名称加上一个(@Qualfiler("name")专门取名字的一个注解,就回会去找改类型为这个名称的注解进行对应,如果没找到,会报错)。
AOP
面向切面编程,抽象化的面向对象的编程,面向对象的补充,以打印日志为例,当我们打印日志和业务当面重叠时(即耦合度很高的情况下,其实是不利于我们开发的),方法的开始的参数,解释的时候打印结果,会有重复的代码,统一的位置抽象起来,形成一个对象,一百个方法,只需要对应的位子,单独处理,自动更新。只保留核心的代码,进行一个分离
那怎么实现呢?
如果单纯使用方法,还得创建对象,其实是比较麻烦的
流程,一个对象,切面对象(即分离出来的某一部分),通过代理对象进行连接,先分离后整合的方式
@ASpect声明是一个参数