XML配置bean只需要在ApplicationContext.xml这个文件中配置即可
使用constructor-arg name指的是类里面的变量名,ref指的是相关类的id
使用property注入数据,name和ref与构造器注入一致,如果你想要注入简单类型(例如int或者String之类的),把ref改为value,想注入什么内容,就修改value的值即可
只需要在对应的实现类前面带上 @Component 即可,如下
@Component
public class BookServiceImpl implements BookService {
@Autowired
private BookDao bookDao;
public void save() {
System.out.println("book service save...");
bookDao.save();
}
}
比如上个代码我们定义的是service的bean,那么我们就可以把@Component改为@Service,功能其实差不多,但是这样写更加明了,让别人直接就能看出来我们定义了一个业务层的bean
我们新定义一个配置类SpringConfig,在这个类,我们使用 @ComponentScan 来扫描已经使用注解定义好的bean,代码如下,@Configuration 表明我们这个类是配置类,@ComponentScan括号里面写我们想扫描的包,这里我们扫描com.cumt下面的所有包,只要已经用注解定义好的bean,我们都可以使用
@Configuration
@ComponentScan("com.cumt")
public class SpringConfig {
}
注解使用自动装配的方式进行依赖注入,只需要在依赖注入的地方写上 @Autowired 即可实现自动装配,如果有重名的bean,可以使用 @Qualifier 表明你到底要注入哪个依赖,写Qualifier的同时还要写Autowired,如果不写则会报错
@Autowired
@Qualifier("依赖的名字")
我们使用@Autowired进行引用类型的依赖注入,但是如果是简单类型,我们使用 @Value,后面带上一个括号,以及里面具体的值,如果是这样的话,为什么不直接给变量值?
因为如果我们使用@Value的话,里面 可以使用${}占位符 来引用properties文件中的变量
// 使用注解的方式,我们可以使用占位符,这里的jdbc.driver写在了property里面
@Value("${jdbc.driver}")
private String name;
// 简单粗暴的方式
private String name = "这里就不可以使用占位符";
在XML中,我们新定义命名空间context使用下面的方法引用了properties文件
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
">
<context:property-placeholder location="classpath*:*.properties"/>
beans>
而在注解中,我们只需要在配置类SpringConfig中加入下面这一句话就可以实现
@Configuration
@ComponentScan("com.cumt")
@PropertySource("jdbc.properties")
public class SpringConfig {
}
使用 @PropertySource(“jdbc.properties”) 注入名为jdbc的这个properties,但是注解也有一个不太方便的问题,注解引用properties不可以使用*通配符,如果你想引入多个properties需要使用数组,例子如下,我们同时引用了三个properties文件
@Configuration
@ComponentScan("com.cumt")
@PropertySource({"jdbc.properties", "jdbc2.properties", "jdbc3.properties"})
@Import(JdbcConfig.class)
public class SpringConfig {
}
我们是不可能在第三方文件中写注解的,所以这就需要我们在Config这个配置类中手写代码,例如下面我手写了Druid(德鲁伊)的配置,我们需要在手写的函数前面加上 @Bean 表明这是一个第三方的bean,函数名通常设置为bean的ID,在这个函数中我们手动new了一个Druid的DataSource,设置好驱动名称等再返回这个DataSource。
@Bean
public DataSource dataSource() {
DruidDataSource ds = new DruidDataSource();
ds.setDriverClassName("${jdbc.driver}");
ds.setUrl("${jdbc.url}");
ds.setUsername("${jdbc.username}");
ds.setPassword("${jdbc.password}");
return ds;
}
使用XML配置第三方的bean是这样的
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
bean>
在init函数之前写 @PostConstruct,意思为在构造之后执行init函数
同理在destroy函数之前写 @PreDestroy,意思为在销毁之前执行destroy函数
@PostConstruct
public void init() {
System.out.println("init...");
}
@PreDestroy
public void destroy() {
System.out.println("destroy...");
}
我们在最主要的那个Config配置类使用Import导入其他配置,如下,我们使用Import导入了JdbcConfig的配置类,这样我们就可以不用把所有的第三方配置全部塞入SpringConfig这一个文件,实现了分层管理
@Configuration
@ComponentScan("com.cumt")
@PropertySource({"jdbc.properties"})
@Import(JdbcConfig.class)
public class SpringConfig {
}