什么是Spring?
Spring是一个分层的javaSE/EE full-stack(一站式)轻量级开源的管理框架。可以解决企业级应用开发的业务逻辑层和其他各层的耦合问题,解决企业级应用开发的复杂性。它为企业级开发提供了丰富的功能,但这些功能的底层都依赖于它的两个核心特性,IOC(Inversesion of Control 控制反转)和AOP(Aspect Oriented Programming 面向切面编程)
Spring的优点?
方便解耦,简化开发,Spring就是一个大工厂,可以将所有对象创建和依赖关系维护交给Spring管理,避免硬编码所造成的过度耦合。
Aop编程的支持。Spring提供面向切面编程,可以方便实现对程序进行权限拦截,运行监控等功能。
声明式事务的支持,只需要通过配置就可以完成对事务的管理,而无需手动编程,提高开发效率和质量。
方便程序的测试,Spring对junit4支持,可以通过注解方便测试Spring程序。
方便集成各种优秀框架,Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Stuts、Hibernate、MyBatis、Quartz)的直接支持。
降低了JavaSE API的使用难度,Spring对javaEE开发中非常难用的一些APl(JDBC、Java Mail、远程调用等),都提供了封装,使这些API应用难度大大降低。
分层
提供三层结构:控制层、业务层、数据访问层(持久层,集成层)
一站式(Spring)
控制层:SpringMVC
持久层:JDBC Template
业务层:Spring的事务管理,备案管理
什么是耦合?
在开发中,对象之间的耦合度指的是对象之间的依赖。对象之间的依赖越高耦合越高,维护成本越高,因此设计时应使类之间的耦合最小。
什么是IOC?
IOC-Inversion of Control “控制反转”,将设计好的对象就交给spring创建实例,而不是由我们编写代码去new了。IOC本质是个容器,是个对象工厂,通过读写配置 文件,在通过它用反射来完成对象的创建。
Spring提供的IOC容器的两种实现方式(接口):
BeanFactory,低级容器,通过只通过注册(put)、获取(get)两个功能。
ApplicationContext,高级容器,继承了多个接口,具备更多的功能。例如资源的获取,支持多种消息(例如JSP tag的支持),工具级别的支持等。
什么是DI?
DI-Dependency Injection“依赖注入”,组件之间依赖关系由容器运行期决定。
什么是AOP?
AOP-Aspect Oriented Programing“面向切面编程”,在不影响类源代码的情况下,给对象增强功能,例如给业务层加日志,或者给持久层操作方法加事务都可以使用AOP统一进行维护。
Java中的代理模式
代理模式是常用的Java模式之一,分为静态代理和动态代理。
代理类主要负责为委托类预处理消息,过滤信息、把信息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,代理类的对象本身并不是真正实现服务,而是通过调用委托类对象的相关方法,来提供特定的服务。
Cglib动态代理
Cglib-(Code Generation Library)开源项目,是一个高性能,高质量的Code生成类库,可以在运行期扩展Java类与实现接口(final(常量)类不能使用Cglib来代理、没有实现接口的不能使用代理),Cglib是针对类来实现代理的,原理是对指定的目标类生产一个子类,并覆盖其中方法实现增强。
Spring注解开发
Spring原始注解
注解 | 说明 |
@Component | 使用在类上用于实例化Bean |
@Controller | 使用在web层类上用于实例化Bean |
@Service | 使用在service层类上用于实例化Bean |
@Repository | 使用在dao层类上用于实例化Bean |
@Autowired | 使用在字段上用于根据类型依赖注入 |
@Qualifier | 结合@Autowired一起使用用于根据名称进行依赖注入 |
@Resource | 相当于@Autowired+@Qualifier,按照名称进行注入 |
@Value | 注入普通属性 |
@Scope | 标注Bean的作用范围 |
@PostConstruct | 使用在方法上标注该方法是Bean的初始化方法 |
@PreDestroy | 使用在方法上标注该方法是Bean的销毁方法 |
Spring新注解
注解 | 说明 |
@Configuration | 用于指定当前类是一个 Spring 配置类,当创建容器时会从该类上加载注解 |
@ComponentScan | 用于指定 Spring 在初始化容器时要扫描的包。 |
@Bean | 使用在方法上,标注将该方法的返回值存储到 Spring 容器中 |
@PropertySource | 用于加载.properties 文件中的配置 |
@Import | 用于导入其他配置类 |
@MapperScan | 扫描mapper层,会帮我们创建mapper接口的代理对象 |
@Transactional | 可以用在类上或方法上,表示该类的方法或者某个方法启动事务管理 |
@EnableTransactionManagement | 启用注解式事务 |