配置bean
在类的上方一个注解: @Component
,就表示配置了该类
@Component("该类的名称,可以省略不写")
public class DaoImpl implements Dao {
public void show(){
}
}
在xml配置文件中,添加扫描注解的配置
# base-package表示要扫描的包
<context:component-scan base-package="com.fyislo"/>
- Spring提供了@Component注解的三个衍生注解
- @Controller:用于表现层的bean定义
- @Service:用于业务层bean定义
- @Repository:用于数据层bean定义
纯注解开发
- Spring3.0开启了纯注解开发模式,使用Java类替代了配置文件,开启了Spring快速快发赛道。
- Java类代替Spring核心配置文件
给类加上一个 @Configuration
表示这是一个配置类
@Configuration//表示这是一个配置类
@ComponentScan("com.dao") //配置扫描注解,指定要扫描的包
public class SpringConfig {}
# 加载配置类初始化容器
ApplicationContext ctx = new AnnotationConfigApplicationContext(配置类的字节码文件);
# 加载配置文件初始化容器
ApplicationContext ctx2 = new ClassPathXmlApplicationContext("配置文件");
@Configuration
注解用于设定当前类为配置类@ComponentScan
注解用于设定扫描路径,此注解只能添加一次,多个数据请用数组格式:@ComponentScan({"com.dao","com.service"})
bean管理
在类加上 @Scope("prototype")
注解,即可更换为非单例模式
- scoper
- singleton:单例(默认)
- prototype:非单例
在类的方法上加上 @PostConstruct
或 @PreDestroy
注解,即可控制bean的生命周期
@Component("bookDao")
@Scope("prototype")//指定该类为非单例模式
public class BookDaoImpl implements BookDao {
@PostConstruct//构造方法后运行
public void init(){}
@PreDestroy//销毁前运行
public void destroy(){}
}
依赖注入
引用类型注入
使用 @Autowired
注解,便可以自动注入属性。按类型注入。
在自动装配的情况下,使用 @Qualifier("指定的名称")
,可以指定它加载对应的变量名称。
@Service
public class BookServiecImpl implements BookService {
@Autowired
@Qualifier("bookDao")
private BookDao bookDao;
}
- 注意:
@Qualifier
注意配合@Autowired
运行 - 注意:自动装配基于反射设计创建对象并暴力反射对应属性为私有属性初始化数据,因此无需提供setter方法
- 注意:自动装配建议使用无参构造方法创建对象(默认),如果不提供对应构造方法,请提供唯一的构造方法
简单类型的注入
在属性上加 @Value("数据")
注解,即可完成简单类型的注入
@Value("zhangsan123")
private String name;
在配置类加载properties的配置文件
@Configuration//表示这是一个配置类
@ComponentScan("com.fyislo")//配置扫描注解
@PropertySource("jdbc.properties")//加载properties的配置文件
public class SpringConfig {}
# 此时@Value就可以使用${}引用properties的配置文件中的数据了
@Value("${name}")
prviate String name;
注意: @PropertySource()
不支持使用通配符*
第三方bean管理
在配置类中定义一个方法,获得要管理的对象,在此方法上加上 @Bean
注解即可。
1、可以使用一个专门管理bean的配置类,只需要的另一个配置类中用 @Impoet
注解导入另一个配置类即可。(推荐)
@Configuration//表示这是一个配置类
@Import({JdbcConfig.class})//导入另一个配置类
public class SpringConfig {}
@Configuration//表示这是一个配置类
public class JdbcConfig {
@Bean
public DataSource dataSource() {
DruidDataSource ds = new DruidDataSource();
ds.setDriverClassName("");
ds.setUr1("");
ds.setUsername("");
ds.setPassword("");
//......其它配置
return ds;
}
}
2、也可以使用 @ComponentScan
注解将独立的配置类加入到核心配置(不推荐)
@Configuration//表示这是一个配置类
@ComponentScan({"com.config","con.data"})//扫描配置类所在的包即可
public class SpringConfig {}
@Configuration//表示这是一个配置类
public class JdbcConfig {
@Bean
public DataSource dataSource() {
DruidDataSource ds = new DruidDataSource();
//......其它配置
return ds;
}
}
- 当我们配置类需要依赖其它类的时候
- 简单类型可以使用
@Value
注解来获得简单类型的注入 - 引用类型可以直接在形参上写入即可获得相应的类
- 简单类型可以使用
@Configuration//表示这是一个配置类
public class JdbcConfig {
@Value("zhangsan")
private String userName;
@Value("123")
private String passWord;
@Bean
public DataSource dataSource(Dao dao) {//在形参的位置写入需要的其它类即可,容器会根据类型自动装配
DruidDataSource ds = new DruidDataSource();
ds.setUsername(userName);
ds.setPassword(passWord);
//......其它配置
System.out.println(dao);//此时便可直接使用
return ds;
}
}