注解
注解驱动:
利用spring提供的注解替代掉xml文件中做的配置,干的活都是一样的
1.bean的定义
@Controller:一边用于表现层注解
@Service:一般用于业务层注解
@Repository:一般用于持久层注解
@Component:用于其他
作用:设置***该类***为spring管理的bean
相关属性:value:定义bean的访问id
示例:
@Component
public class user{}
2.bean的作用域
@Scope:设置该类作为bean对应的scope属性,默认为singleton
//@scope默认是单例模式(singleton)即:@scope(“singleton”)
//1.singleton单例模式,全局有且仅有一个实例
//2.prototype原型模式,每次获取Bean的时候会有一个新的实例
3.bean的生命周期
@PostConstruct:设定bean的生命周期-新建
@PreDestroy:设定bean的生命周期-销毁
依赖资源:
dependency>
<groupId>javax.annotation</groupId>
<artifactId>jsr250-api</artifactId>
<version>1.0</version>
</dependency>
@Bean
作用:设置***该方法***的返回值作为spring管理的bean
示例:
@Bean("dataSource")
private DruidDataSource getdataSource(){
DruidDataSource ds = new DruidDataSource();
ds.setDriverClassName(driver);
ds.setUrl(url);
ds.setUsername(username);
ds.setPassword(password);
return ds;
}
非引用类型注入
@Value:设置对应属性的值或对方法进行传参
说明:
1.value值仅支持非引用类型数据,赋值时对方法的所有参数全部赋值
2.value值支持读取properties文件中的属性值,通过类属性将properties中数据传入类中
3.value值支持SpEL
4.@value注解如果添加在属性上方,可以省略set方法(set方法的目的是为属性赋值)
示例:
@Value("${jdbc.driver}")
private String driver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
引用类型注入
@Autowired:按类型装配
@Qualifier:指定自动装配的bean的id
@Resource :可以替代掉 @Autowired @Qualifier 但是不推荐使用
属性:
name:设置注入的bean的id
type:设置注入的bean的类型,接收的参数为Class类型
什么属性不指定, 默认按照类型注入
示例:
@Autowired(required = false)
@Qualifier("userDao")
private UserDao userDao;
引用类型属性注入
@Primary:设置类对应的bean按类型装配时优先装配
@Autowired默认按类型装配,当出现相同类型的bean,使用@Primary提高按类型自动装配的优先级,多个@Primary 会导致优先级设置无效
示例:
@Primary
public class ClassName{}
加载properties文件
@PropertySource:加载properties文件中的属性值
示例:
@PropertySource(value = {"classpath:filename.properties","classpath:abc.properties"},ignoreResourceNotFount = true)
public class UserDao{}
纯注解驱动
@Configuration、@ComponentScan:设置当前类为spring核心配置加载类, 替代掉applicationContext.xml
核心配合类用于替换spring核心配置文件,此类可以设置空的,不设置变量与属性
bean扫描工作使用注解@ComponentScan替代
示例:
@Configuration
@ComponentScan("包名")
public class SpringConfig{
}
第三方bean配置与管理
@Import:导入@Bean 所在的类
@Import注解在同一个类上,仅允许添加一次,如果需要导入多个,使用数组的形式进行设定
在被导入的类中可以继续使用@Import导入其他资源
@Bean所在的类可以使用导入的形式进入spring容器,无需声明为bean
示例:
@Import({JDBCConfig.class})
@Configuration
@ComponentScan("包名")
public class SpringConfig{
}
//被导入的类
public class JDBCConfig{
@Bean("dataSource")
private DruidDataSource getdataSource(){
DruidDataSource ds = new DruidDataSource();
ds.setDriverClassName(driver);
ds.setUrl(url);
ds.setUsername(username);
ds.setPassword(password);
return ds;
}
}
bean加载控制
@DependsOn(“其他beanid”):控制bean的加载顺序,使其指定bean加载完毕后再加载
注意:
1、Spring管理的bean默认都是单例模式(singleton)
2、实例化对象应该顺序化的,比如A依赖B,B依赖C,C依赖D…
3、一个bean可以依赖多个bean,可以通过逗号(",")来定义多个依赖对象
示例:
@DependsOn("beanId1,beanId2,beanId3")
public class SpringConfig{
}
@Order(“数字”):控制@Configuration修饰类的加载顺序
注意:
1.@Order 的数字值 越大优先级越低,例如 1 的优先级大于
2.优先级越大的类中 @bean 修饰的方法优先注入
@Order(1)
public class SpringConfig{
}
@Lazy:控制bean的加载时机,使其延迟加载
注意:
1)用于指定单例bean实例化的时机,在没有指定此注解时,单例会在容器初始化时就被创建。而当使用此注解后,单例对象的创建时机会在该bean在被第一次使用时创建,并且只创建一次。第二次及以后获取使用就不再创建。
2)在实际开发场景中,并不是所有bean都要一开始就被创建的,有些可以等到使用时才创建。此时就可以使用该注解实现。
3)此注解只对单例bean有用,原型bean时此注解不起作用。
示例:
@Component
@Lazy
public class UserService{
public UserService(){
System.out.println("userService创建了")
}
}