Spring框架

关于Spring 框架

● Spring框架主要解决了创建对象管理对象的问题。

● 在开发实践中,Spring框架的核心价值在于:开发者可以通过Spring框架提供的机制,将创建对象、管理对象的任务交给Spring来完成,以至于开发者不必再关心这些过程,当需要某个对象时,只需要通过Spring获取 对象即可。

– Spring框架也经常被称之为:Spring容器。

● Spring框架还很好的支持了AOP。

● 在开发实践中,有许多类型的对象、配置值都需要常驻内存、需要有唯一 性,或都需要多处使用,自行维护这些对象或值是非常繁琐的,通过 Spring 框架可以极大的简化这些操作。

在Maven工程中使用Spring

依赖代码:

<dependency> 
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId> 
    <version>5.3.14</version>
</dependency>
以上代码中版本号可按需调整

通过Spring管理对象

创建对象的方式:

● 如果需要Spring管理对象,就必须先创建对象,然后Spring获取到对象 才可以进行管理

● 被Spring管理的对象,通常也称之为Spring Bean

● 创建对象的方式有2种:

        – 通过@Bean方法

        – 通过组件扫描

通过@Bean方法创建对象:

● 编码步骤:

– 创建cn.tedu.spring.SpringBeanFactory类

– 在类中添加方法,方法的返回值类型就是你希望Spring创建并管理的对象的类型, 并在此方法      中自行编写返回有效对象的代码

– 在此类上添加@Configuration注解

– 在此方法上添加@Bean注解

● 示例代码:

package cn.tedu.spring;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Random;

@Configuration
public class SpringBeanFactory {

    @Bean
    public Random random() {
        return new Random();
    }

}

● 测试运行的编码步骤:

– 创建任意类,在类中添加main()方法,将通过此方法测试运行,以观察运行效果

– 如果你已经掌握JUnit的用法,且添加了JUnit依赖,也可以使用JUnit测试

– 创建AnnotationConfigApplicationContext类型的对象,并使用添加了 @Configuration注解的类作为构造方法参数 – 这是ApplicationContext接口的实现,通常称之为Spring的应用程序上下文

– 调用AnnotationConfigApplicationContext对象的getBean()方法,以获取@Bean 注解方法返回的对象

– 自行测试获取的对象 – 调用AnnotationConfigApplicationContext对象的close()方法,以关闭

 ● 测试运行:

package cn.tedu.spring;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import java.util.Random;

public class SpringRunner {

    public static void main(String[] args) {
        // 1. 让Spring跑起来
        // AnnotationConfigApplicationContext:用于加载Spring配置,是Spring容器
        // 注意:需要在构造方法中添加参数
        AnnotationConfigApplicationContext ac
                = new AnnotationConfigApplicationContext(SpringBeanFactory.class);

        // 2. 从Spring中获取对象
        Random random = ac.getBean("random", Random.class);

        // 3. 测试使用
        System.out.println(random);

        // 4. 结束
        ac.close();
    }

}
通过组件扫描创建对象

组件注解:
除了@Component以外,在Spring框架中还可以使用@Repository、 @Service、@Controller表示某个类是组件类

组件注解应用:

在Spring框架的解释范围内,组件注解的用法及作用表现是完全相同的, 但字面语义不同,在开发实践中,应该根据类的定位进行选取:

– @Repository:用于实现数据访问的类

– @Service:用于处理业务逻辑的类

– @Controller:用于控制器类

– @Component:通用组件注解,即:不适合使用以上注解的组件类则添加此注解

– @Configuration也使用了@Component作为元注解,所以,此注解也可 以视为“组件注解”,但是Spring框架对其处理方式更为特殊(使用了代理模式),所以仅当某个类的作用是编写各种配置代码时,才会使用 @Configuration。

选择创建对象的方式

以上已经介绍了2种创建对象的方式,相比之下:

– 通过@Bean方法:需要在配置类中添加@Bean方法,需要Spring管理的对象越多, 则需要添加的@Bean方法就越多,虽然每个方法的代码并不复杂,但是当方法的数 量到一定程度后也比较繁琐,不易于管理,这种做法的优点是可以完全自定义对象的 创建过程,在@Bean方法内部仍是传统的创建对象的语句

– 通过组件扫描:只需要配置1次组件扫描,然后各组件类添加组件即可,且各组件类 添加组件注解后也可增强语义,所以,无论编码成本还是代码的可读性都更好,这种做法的不足在于“只能适用于自定义的类”,毕竟你不可以在引用的库中的类上添加组件注解

Spring Bean的作用域

● 在默认情况下,由Spring Bean的作用域是单例的 实例唯一(与设计模式单例模式无关)

● 可以通过@Scope注解修改作用域(声明在@Bean注解之上/组件类声明之前)

@Scope注解的scopeName属性的常见取值有:

– singleton:单例的

– 事实上这是默认值,在scopeName属性的源码上明确的说明了:Defaults to an empty string "" which implies ConfigurableBeanFactory.SCOPE_SINGLETON,且以上常 量的值就是singleton

– prototype:原型,是非单例的

– 还有其它取值,都是不常用取值,暂不关心

@Configuration
public class SpringBeanFactory {

@Scope("prototype") 
@Bean 
public Random random() { 

return new Random();

 } 
}
------------------------------------------------------
@Scope("prototype") 
@Repository 
public class UserMapper {

 }

Spring Bean的加载模式:

● 在默认情况下,单例的Spring Bean是预加载的,必要的话,也可以将其 配置为懒加载的

        – 如果某个对象本身不是单例的,则不在此讨论范围之内

● 预加载的表现为:加载Spring环境时就会创建对象,即加载Spring配置 的环节,会创建对象

● 懒加载的表现为:加载Spring环境时并不会创建对象,而是在第1次获取 对象的那一刻再创建对象

可以通过@Lazy注解来配置懒加载

@Lazy注解的参数是不需要关心的,因为:

–  单例的Spring Bean默认就是预加载的,不是懒加载的,所以,保持默认状态时,不使用@Lazy注解即可,并不需要配置为@Lazy(false)

–  @Lazy注解的value属性默认为true,所以,当需要将单例的Spring Bean配置为懒 加载时,只需要添加@Lazy注解即可,并不需要配置为@Lazy(true)

预加载:

预加载的优点在于:

事先创建好对象,无论何时需要获取对象,都可以直 接获取。

缺点在于:相当于启动程序时就会创建对象,这样的对象越多, 启动过程就越慢,并且,如果某个对象创建出来以后,在接下来的很长一 段时间都不需要使用,而此对象却一直存在于内存中,则是一种浪费

懒加载:

懒加载的优点在于:

仅当需要对象时才会创建对象,不会形成浪费。

缺点 在于:如果当前系统已经负荷较重,需要的对象仍未加载,则会增加系统负担。

自动装配

● Spring的自动装配机制表现为:当某个量需要被赋值时,可以使用特定的语法,使得Spring尝试从容器找到合适的值,并自动完成赋值

● 最典型的表现就是在类的属性上添加@Autowired注解,Spring就会尝试从容器中找到合适的值为这个属性赋值

● 除了对属性装配以外,Spring的自动装配机制还可以表现为:如果某个方法是由Spring框架自动调用的(通常是构造方法,或@Bean方法),当 这个方法被声明了参数时,Spring框架也会自动的尝试从容器找到匹配的 对象,用于调用此方法

● 对方法的参数自动装配时,如果方法有多个参数,各参数的先后顺序是不重要的

@Autowired的装配机制

● 关于@Autowired的装配机制,首先,会根据需要装配的数据的类型在 Spring容器中统计匹配的Bean(对象)的数量

● 当匹配的Bean数量为0个时,判断@Autowired注解的required属性值

– true(默认):装配失败,启动项目时即抛出NoSuchBeanDefinitionException

– false:放弃自动装配,不会报告异常,后续直接使用此属性时,会出现NPE

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孙慧德

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值