spring纯注解开发-高级注解
目录
前言
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;
}
结果:
这样的注入不是通过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标签),我们不会得到该类。
细节:注解用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");
上一篇: spring纯注解开发-基本注解。
下一篇: 学习 openssl 证书命令