注解开发定义bean
使用@component定义bean
@Component("bookDao")
public class BookDaoImpl implements BookDao{}
核心配置文件中通过组件扫描加载bean
<context:component-scan base-package="com.tsj"/>
Spring提供@Component注解的三个衍生注解,他的作用完全相同,仅仅是为了让开发者更加易读。
@Crontoller:用于表现层bean定义。
@Service:用于业务层bean定义。
@Repository:用于数据层bean定义。
纯注解开发
我们可以创建一个类来代替配置文件,第一个@Configuration代替了大段的文本,ComponentScan代替扫描。
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
//该注解将此类声明为注解类,代表了配置文件中超大端的文字
@Configuration
@ComponentScan("com.tsj")
public class SpringConfig {
}
注意:@Configuration用于设定当前类为配置类,@ComponentScan注解用于设定扫描,此注解只能添加一次,多个数据请用数组方式。
//数组
@Configuration
@ComponentScan({"com.tsj","com.tsj.dao","com.tsj"})
public class SpringConfig {
}
特别的,加载配置类初始化容器和原来加载配置文件初始化容器是不同的。
注意new 的是不一样的内容。
public class APPForConfiguration {
public static void main(String[] args) {
//创建Ioc容器
ApplicationContext ctx=new AnnotationConfigApplicationContext(SpringConfig.class);
BookDao bookDao=ctx.getBean("bookDao",BookDao.class);
//调用了子类中重写的方法,且向上转换只能调用子类重写的方法
bookDao.save();
}
}
控制bean对象是否单列
注意:singleton单列,prototype非单列。
@Component("bookDao")
@Scope("singleton")
public class BookDaoImpl implements BookDao{}
控制bean的生命周期方法
回顾:在xml配置中控制bean的方法:1、创建方法,配置xml。2、实现接口
注解开发中,我们手动的书写两个方法init和destrory并分别给他们加上注解。
@PostConstruct在构造方法之后
@PreDestory在销毁之前
@PostConstruct
public void init(){
System.out.println("init...");
}
@PreDestroy
public void destory(){
System.out.println("destory...");
}
注意:想要使用此注解需要在pom.xml文件内倒入坐标
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
使用注解开发进行依赖注入
@Autowired自动注入,使用暴力反射为变量进行赋值。此处的反射是根据类型进行反射,所以一个DI注入中只能存在一个类型。
@Service
public class UserDaoImpl implements UserDao{
@Autowired
private BookDao bookDao;
}
当不同的bean实现了同一个接口时,我们不能够继续通过类型扫描的方式来获取bean。这时需要我们进行类名进行获取。
@Service
public class UserDaoImpl implements UserDao{
@Autowired
@Qualifier("bookDao")
private BookDao bookDao;
}
注意:
1、自动装配基于反射设计创建对象并暴力反射对应属性为私有属性初始化数据,因此无需提供setter方法。
2、自动装配建议使用无参构造方法创建对象(默认),如果不提供对应的构造方法,请提供唯一的构造方法。
3、使用Qualifer注解无法单独使用,必须配合@Autowired注解使用。
给基础数据类型及String注入
@Value("woxiangchiDurian")
private String name;
使用Vaule注解进行数据初始化的原因是,我们时常需要使用配置文件进行数据处理,那么注解开发中怎么导入配置文件呢。
步骤一:我们需要在SpringConfig类中增加配置文件注解,声明配置文件的路径。
@Configuration
@ComponentScan({"com.tsj","com.tsj.dao","com.tsj"})
@PropertySource("jdbc3.properties")
public class SpringConfig {
}
如果有多个配置文件,我们可以通过数组的方式进行声明。
@Configuration
@ComponentScan({"com.tsj","com.tsj.dao","com.tsj"})
@PropertySource({"jdbc3.properties","jdbc3.properties","jdbc3.properties"})
public class SpringConfig {
}
不可以使用*.properties进行声明。
步骤二:在bean类中进行赋值
@Value("${name}")
private String name;
注解开发管理第三方bean
由于我们不可以直接把注解写在第三方的代码中,所以我们必须手动编程的去书写代码。
1、创建一个方法获取想要管理的对象
2、添加@Bean表示当前返回值类型是一个bean
public class SpringConfig {
//1、创建一个方法获取想要管理的对象
//2、添加@Bean表示当前返回值类型是一个bean
@Bean
public DataSource dataSource(){
DruidDataSource ds=new DruidDataSource();
ds.setDriverClassName("root");
ds.setPassword("root");
ds.setPassword("root");
return ds;
}
}
注意:Config是Spring的配置类,通常情况下我们会单独创建一个其他的配置类来书写有关第三方bean的代码。
方法一:使用Import注解在SpringConfig类中将加载待导入配置类的字节码文件。此注解只允许写一次,想要导入多个配置类需要使用数组的方式。
JdbcConfig类
@Configuration
public class JbdcConfig {
//1、创建一个方法获取想要管理的对象
//2、添加@Bean表示当前返回值类型是一个bean
@Bean
public DataSource dataSource(){
DruidDataSource ds=new DruidDataSource();
ds.setDriverClassName("root");
ds.setPassword("root");
ds.setPassword("root");
return ds;
}
}
SpringConfig类
@Import({JbdcConfig.class,JbdcConfig.class,JbdcConfig.class})
public class SpringConfig {
}
方法二:使用包扫描的方式(不推荐,因为无法清晰的表明各个配置类的关系)
@ComponentScan({"com.tsj","com.tsj.dao","com.tsj"})
@Import({JbdcConfig.class,JbdcConfig.class,JbdcConfig.class})
public class SpringConfig {
}
为第三方bean注入资源
如果是基础类型以及String。
创建变量,使用Value注解对其复制,再通过set方法为第三方bean初始化资源。
@Value("ceshi")
private String driver;
@Value("ceshi")
private String password;
@Bean
public DataSource dataSource(){
DruidDataSource ds=new DruidDataSource();
ds.setDriverClassName(driver);
ds.setPassword(password);
return ds;
}
如果是引用数据类型
自动装配,只要我们有一个形参,并且Spring检测到这是一个bean,它认为需要给我们自动提供一个对象,通过SpringConfig中的Scan扫描到了相对应的bean,会帮我们自动注入对象。
只要我们提供形参,Spring会自动为我们装配对象。
@Bean
public DataSource dataSource(BookDao bookDao){
System.out.println(bookDao);
DruidDataSource ds=new DruidDataSource();
ds.setDriverClassName(driver);
ds.setPassword(password);
return ds;
}
XML开发与注解开发对比