关于Spring框架的一些总结

1.什么是Spring框架?

Spring是一种轻量级的、非侵入式的开发框架,旨在提高开发人员的开发效率以及系统的可维护性。

Spring 官网列出的 Spring 的 6 个特征:

  • 核心技术 :依赖注入(DI),AOP,事件(events),资源,i18n,验证,数据绑定,类型转换,SpEL。
  • 测试 :模拟对象,TestContext框架,Spring MVC 测试,WebTestClient。
  • 数据访问 :事务,DAO支持,JDBC,ORM,编组XML。
  • Web支持 : Spring MVC和Spring WebFlux Web框架。
  • 集成 :远程处理,JMS,JCA,JMX,电子邮件,任务,调度,缓存。
  • 语言 :Kotlin,Groovy,动态语言。

2.一些重要的Spring模块

  • Spring Core: 基础,Spring其他所有功能都需要依赖此类库,主要提供IOC依赖注入功能
  • Spring Aspects: 该模块为与AspectJ的集成提供支持(AspectJ:AOP编程思想的一个实践)
  • Spring AOP:提供了面向切面的编程实现
  • Spring JDBC:Java数据库连接
  • Spring JMS:Java消息服务
  • Spring ORM:用于支持Hibernate等ORM工具(ORM即Object Relation Mapping:对象关系映射)
  • Spring Web:为创建Web应用程序提供支持
  • Spring Test:提供了对 Junit 和 TestNG 测试的支持

3.@RestController vs @Controller

@Controller 返回一个页面
@RestController 返回Json或Xml形式数据
@Controller+@Response 返回Json或Xml形式数据

4.Spring IOC & AOP

4.1 对于Spring IOC 和 AOP 的理解

IOC

IOC(Inverse of Contril:控制反转)是一种设计思想就是讲原本在程序中手动创建对象的控制权,交由Spring框架来管理IOC容器是Spring用来实现IOC的载体,IOC容器实际上就是个Map(key,value),Map中存放的是各种对象。当我们需要创建一个对象的时候,只需要配置好配置文件/注解就好,完全不用考虑对象是如何被创建出来的。

AOP

AOP(Aspect-Oriented Programming:面向切面编程)能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可扩展性和可维护性。

Spring AOP基于动态代理。

4.2 Spring AOP 和 AspectJ AOP 的区别

Spring AOP 是运行时增强,AspectJ AOP是编译时增强。 Spring AOP 基于代理(Proxying),而 AspectJ 基于字节码操作(Bytecode Manipulation)。

5.Spring Bean

5.1 Spring中的bean的作用域有哪些?

  • singleton:唯一bean实例,Spring中的bean默认是单例的。
  • property:每次请求都会创建一个新的bean实例。
  • request:每一次HTTP请求都会创建一个新的bean,该bean只在当前HTTP request中有效。
  • session:每一次HTTP请求都会产生一个新的 bean,该bean仅在当前 HTTP session 内有效。

5.2 Spring中的单例bean的线程安全问题

(待解答)

5.3 @Component 和 @Bean的区别

1.作用对象不同:@Component 注解作用于类,@Bean 注解作用于方法。

2.@Component  通常是通过类路径扫描来自动侦测以及自动装配到Spring容器中。@Bean 注解通常是我们在标有该注解的方法中定义产生这个 bean,@Bean告诉了Spring这是某个类的示例,当我需要用它的时候还给我。

3.@Bean 注解比 @Component注解的自定义性更强,而且很多地方我们只能用@Bean注解来注册@Bean。比如当我们引用第三方库中的类需要装配到Spring容器时,只能通过@Bean来实现。

@Bean 注解实例:

@Configuration
public class AppConfig {
    @Bean
    public TransferService transferService() {
        return new TransferServiceImpl();
    }
}

上面的代码相当于下面的xml配置:

<beans>
    <bean id="transferService" class="com.acme.TransferServiceImpl"/>
</beans>

下面这个例子是通过 @Component 无法实现的

@Bean
public OneService getService(status) {
    case (status)  {
        when 1:
                return new serviceImpl1();
        when 2:
                return new serviceImpl2();
        when 3:
                return new serviceImpl3();
    }
}

5.4 将一个类声明为Spring的 bean 的注解有哪些?

我们一般使用 @Autowired 或 @Resource  注解自动装配 bean,要想把类标识成可用于 @Autowired 或 @Resource 注解自动装配的 bean 的类,采用以下注解可实现:

  • @Component : 通用的注解,可标注任意类为 Spring 组件。如果一个Bean不知道属于哪个层,可以使用@Component 注解标注。
  • @Repository : 对应持久层即 Dao 层,主要用于数据库相关操作。
  • @service : 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao层。
  • @Controller : 对应 Spring MVC 控制层,主要用于接受用户请求并调用 Service 层返回数据给前端页面。

5.5 @Autowired与@Resource

@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了。@Resource有两个属性是比较重要的,分别是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。

5.6 Spring中的Bean的生命周期

(待解答)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值