1.IOC控制反转
在一开始设计组件依赖的时候就考虑到未来出现改动的可能性,所有需要import组件的地方都被替换成了接口,任何业务组件都不再直接控制import哪个具体组件,而是把这个控制权交给spring的配置中心。
IOC控制反转最典型的应用就是Autowired注解。
Spring IOC 容器
Spring 框架的核心是 Spring 容器。容器创建对象,将它们装配在一起,配置它们并管理它们的完整生命周期。Spring 容器使用依赖注入来管理组成应用程序的组件。容器通过读取提供的配置元数据来接收对象进行实例化,配置和组装的指令。该元数据可以通过 XML,Java 注解或 Java 代码提供。
AOP面向切面编程
什么是AOP?
在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。
AOP的好处了是把和主业务无关的事情,放到代码外面去做。
举个例子,你想给你的网站加上鉴权,
对某些url,你认为不需要鉴权就可以访问,
对于某些url,你认为需要有特定权限的用户才能访问,
如果你依然使用OOP,面向对象,那你只能在那些url对应的Controller代码里面,一个一个写上鉴权的代码。
如果你使用AOP,只需要在配置文件中配置相应的url的用户访问许可即可。
如何使用AOP?
代理模式
静态代理指我们手动生成一个代理类,代理UserController的saveUser()方法,实现鉴权操作。
class UserControllerProxy {
private UserController userController;
public void saveUser() {
checkAuth();
userController.saveUser();
}
}
而SpringAOP是基于动态代理的,
如果要代理的对象,实现了某个接口,那么Spring AOP会使用JDK Proxy,去创建代理对象,
而对于没有实现接口的对象,就无法使用JDK Proxy去进行代理了,
这时候Spring AOP会使用Cglib,生成一个被代理对象的子类,来作为代理.
Spring Security安全管理
什么是Spring Security
Spring Security是基于Servlet的Filter
核心功能主要包括:
- 认证 (你是谁)
- 授权 (你能干什么)
- 攻击防护 (防止伪造身份)
比如,对于username password认证过滤器来说,
- 会检查是否是一个登录请求;
- 是否包含username 和 password (也就是该过滤器需要的一些认证信息) ;
- 如果不满足则放行给下一个。
如何使用Spring Security
假设你希望防止未经授权的用户访问“/ hello”。 此时,如果用户点击主页上的链接,他们会看到问候语,请求被没有被拦截。 你需要添加一个障碍,使得用户在看到该页面之前登录。您可以通过在应用程序中配置Spring Security来实现。
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/home").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.permitAll();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth
.inMemoryAuthentication()
.withUser("user").password("password").roles("USER");
}
}
Spring生命周期
Spring Bean的生命周期指的是Bean从创建到初始化再到销毁的过程,这个过程由IOC容器管理。
实例化(Instantiation)
属性赋值(Populate)
初始化(Initialization)
销毁(Destruction)
Spring Framework中有多少个模块
- Spring 核心容器
- 数据访问/集成(数据库交互)
- Web
- Instrumentation
- Test
依赖注入
在依赖注入中,您不必创建对象,但必须描述如何创建它们。
您不是直接在代码中将组件和服务连接在一起,而是描述配置文件中哪些组件需要哪些服务。
由 IoC 容器将它们装配在一起。
- 构造函数注入
- setter 注入
- 接口注入