欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

spring纯注解开发-高级注解

程序员文章站 2022-07-12 23:02:49
...

目录

 

前言

1,配置bean

2,配置文件

高级注解

@Bean注解的基本使用

1,简单对象的创建

2,复杂对象的创建

3,属性注入

整合基础注解

排除方式

同理,包含策略:

工厂创建对象的方式有多种。

1,多种配置文件的应用场景。

2,配置优先级

基于注解形式的耦合问题的解决


前言

1,配置bean

spring在3.x提供的新的注解,用于替换XML文件。

一个自定义(AppConfig)[email protected]=XML文件。

2,配置文件

XML文件应用ClassPathXMLApplicationContext。

而注解 应用新的工厂 AnnotationConfigApplicationContext(AppConfig.class||"basePackage");

工厂扫描这个包及其子包,查找 具有 @Configuration类型的注解。

@Configuration也是@Component的衍生注解(等效)。

所以可以在XML文件中应用<context:component-scan>进行注解扫描

高级注解

@Bean注解的基本使用

在AppConfig类中定义方法。

1,简单对象的创建

能直接通过new的方式创建的。

import org.springframework.context.annotation.*;
@Configuration
public  class AppConfig {

    /**
     * bean注解定义对象的创建 value 自定义id名称
     * @return 返回创建的对象
     */
    @Scope("singleton")//定义对象的创建次数
    @Bean("u")//自定义id名称
    public User user(){
        return new User();
    }

}
private ApplicationContext ctx;

    @Before
    public void init(){
        this.ctx = new AnnotationConfigApplicationContext(AppConfig.class);
    }
    @org.junit.Test
    public void test1(){
        User u = (User) ctx.getBean("u");
        System.out.println(u);
}

2,复杂对象的创建

不能通过new的方式创建的对象,没有源文件的Java类。

在XML的方式的配置中,我们使用bean中 factory-bean与factory-method属性。若不想使用该属性那么复杂类实现FactoryBean接口。

在@Bean注解方式中,我们只需要在注解中书写创建对象的代码即可。

有人会问,那么我写的是创建对象的代码【return new User()】,如果我再次调用的话,那岂不是又调用了这个代码吗?

那么你可能忘了,spring工厂可以控制对象的创建次数【默认是单例】,所以你调用getBean的话,还是原来那个对象。除非你在@Bean标签上@Singleton("prototype")。

所以,像FactoryBean一样,你只需要写getObject【如何创建对象】就可以了。

整合遗留系统,用@Bean【纯注解的方式】。

3,属性注入

@AutoWired(自定义类型)

@Service
public class UserServiceImpl implements UserService {
//    spring在工厂中自动寻找该类型,为其注入
    @Autowired
    private UserDao userDao;
//setter and getter 略
}

@Value(通过外部properties文件给属性赋值-8种基本类型+string)

@Component
@PropertySource(value = "classpath:init.properties")
public class User {
    @Value("${name}")
    private String name;
    @Value("${password}")
    private String password;
}

结果:

spring纯注解开发-高级注解

这样的注入不是通过set和构造注入得到的。

整合基础注解

@ComponentScan

我们的基础注解,比如所@Service,@Component等 代替bean标签,基础注解的使用离不开XML中的<context:component-scan base-package="basePackage">,包的扫描。那么我们的全注解的形式如何包扫描呢?

@Configuration
//包扫描的注解
@ComponentScan(basePackages = {"domain",。。。})
public  class AppConfig 

涉及到包扫描,自然就有排除方式和包含方式的使用。

排除方式

代码:

Configuration
//包扫描的注解
@ComponentScan(basePackages = "domain",excludeFilters = {@ComponentScan.Filter(type = FilterType.ASPECTJ,pattern = "domain..User")})
public  class AppConfig {}

因为我们屏蔽了user类,所以,工厂不会自动创建user类(该类上的@Component没有被扫描==没有配置xml的bean标签),我们不会得到该类。

spring纯注解开发-高级注解

细节:注解用value,aspectj和Regex用pattern。

同理,包含策略:

包含使用
@ComponentScan(basePackages = "demo",useDefaultFilters = false
        , includeFilters = {@ComponentScan.Filter(type = FilterType.ASPECTJ,pattern = "domain..User")}
        )

包含策略要先使默认策略失效哦。

工厂创建对象的方式有多种。

比如说User类。@Component和@Bean

1,多种配置文件的应用场景。

@Component和@AutoWired,程序员自己开发的类型上。

@Bean,框架提供的类型,别的程序员提供的类(没有源码)--SqlSessionFactoryBean,MapperScannerConfiguration类

纯注解的方式,基本不用XML,但是要有【用于遗留系统的整合】。

纯注解的方式,多个@Configuration连用 应用@Import(类.class)。用于框架底层,和多个配置bean【纯注解方式】的连用。

2,配置优先级

优先级高的可以覆盖优先级低的。

@Component及其衍生注解<<@Bean<<xml <bean>

配置覆盖:id值保持一致

在配置bean中导入XML文件@ImportResource(''xxx.xml"),在config类上。

基于注解形式的耦合问题的解决

注解是基于源文件的。有关于源代码的肯定存在耦合。

解决方式:1,在@Configuration类上加@ImportResource,导入XML配置文件。

2,原来的AppConfig没有这个注解怎么办?新建一个AppConfig2,把这个当做主配置文件(@Import(AppConfig2.class))。或者AnnotationConfigApplicationContext指定配置文件包。

@Configuration
@Import(AppConfig.class)
public class AppConfig2 {
}
ApplicationContext ctx=new AnnotationConfigApplicationContext(AppConfig2.class);
ApplicationContext ctx=new AnnotationConfigApplicationContext("basePackages");