@Configuration注解
@Configuration配置类注解,在纯注解配置中,类加了该注解,就意味着该类是Spring的配置类。该类的功能就是用于替代原来的XML配置文件。作用:
用于指定当前类是一个spring配置类,当创建容器时会从该类上加载注解。获取容器时需要使用AnnotationConfigApplicationContext(有@Configuration注解的类.class)。
@ComponentScan注解
@ComponentScan注解扫描类,作用就是配置扫描Spring组件类的路径。功能等同原来配置文件的--作用:
用于指定spring在初始化容器时要扫描的包。作用和在spring的xml配置文件中的:
是一样的。
--属性:
basePackages:用于指定要扫描的包。和该注解中的value属性作用一样。
@PropertySource注解
作用:用于加载.properties文件中的配置。例如我们配置数据源时,可以把连接数据库的信息写到properties配置文件中,就可以使用此注解指定properties配置文件的位置。
属性:
value[]:用于指定properties文件位置。如果是在类路径下,需要写上classpath:
@Bean注解
作用:该注解只能写在方法上,使用此方法创建一个对象,并且放入spring容器。它就相当于我们之前在xml配置中介绍的
属性:
name:给当前@Bean注解方法创建的对象指定一个名称(即bean的id)。
@Import注解
作用:用于导入其他配置类,在引入其他配置类时,可以不用再写@Configuration注解。当然,写上也没问题。
属性:
value[]:用于指定其他配置类的字节码。
@Value注解
读取properties配置文件以后, 使用 ${key}获取配置文件中对应的值@Vlaue(“${jdbc.dirverClassName}”)
private String driverClassName;
配置步骤
项目结构图
SpringConfig
package com.spring.config;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.PropertySource;
import com.alibaba.druid.pool.DruidDataSource;
/*
* 此类在spring全注解开发中当做spring框架的配置类,用于替代applicationContext.xml配置文件
*
* -----------------------------------------------------------------------------------------
* 【1】@Configuration //作用:把当前类作为spring配置文件类
*
* -----------------------------------------------------------------------------------------
* 【2】@ComponentScan(basePackages = "com.spring") 也可以这样写@ComponentScan("com.spring")
* 作用:配置spring支持注解配置的包扫描注解
*
* -----------------------------------------------------------------------------------------
* 【3】@Bean 作用:spring创建对象,相当于<bean>标签
* name属性:设置bean的名称。不取,默认对象名为方法名。相当于<bean name=""/>
* initMethod属性:设置初始化方法,相当于<bean initMethod=""/>
* destroyMethod属性:设置销毁方法,相当于<bean destroyMethod=""/>
* @Scope作用:设置bean对象的作用范围
* -----------------------------------------------------------------------------------------
* 【4】@PropertySource 作用:读取properties配置文件。
* 相当于<context:property-placeholder location="classpath:db.properties"/>
* 读取配置文件必须加上:classpath:前缀
* -----------------------------------------------------------------------------------------
* 【5】@Value 作用:注入基本数据类型以及它们的包装类和String类型数据的,支持注入Properties文件的键值对
* 相当于<proprty name="…" value="${Key}">。
* -----------------------------------------------------------------------------------------
* 【6】@Import 作用:用于导入其他配置类
* value属性:用于指定其他配置类的字节码。
* -----------------------------------------------------------------------------------------
*/
@Configuration //作用:把当前类作为spring配置文件类
@ComponentScan(basePackages = "com.spring") //包扫描
@PropertySource("classpath:db.properties")
@Import(SpringConfig1.class)
public class SpringConfig {
@Value("${jdbc.driverName}")
private String driverClassName;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
@Value("10")
private Integer maxActive;
@Bean(initMethod = "init",destroyMethod = "close") //相当于<bean>标签
//@Scope("singleton")
public DataSource getDataSource() {
System.out.println("创建数据源");
DruidDataSource dataSource=new DruidDataSource();
dataSource.setDriverClassName(driverClassName);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
dataSource.setMaxActive(maxActive);
return dataSource;
}
}
SpringConfig1
package com.spring.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration //作用:把当前类作为spring配置文件类
public class SpringConfig1 {
@Bean
public Object getObject() {
System.out.println("xxx");
return new Object();
}
}
db.properties
#批量修改alt+shift+a,使用鼠标多拉,修改完毕以后,alt+shift+a 还原
jdbc.driverName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/gj1?characterEncoding=utf8
jdbc.username=root
jdbc.password=123456
jdbc.maxActive=10
CustomDaoImpl
package com.spring.dao.impl;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import com.spring.dao.CustomDao;
@Repository
public class CustomDaoImpl implements CustomDao{
@Autowired
private DataSource dataSource;
@Override
public void insert() {
try {
Connection connection = dataSource.getConnection();
System.out.println(connection);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
CustomServiceImpl
package com.spring.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.spring.dao.CustomDao;
import com.spring.service.CustomService;
@Service
public class CustomServiceImpl implements CustomService{
@Autowired
private CustomDao customDao;
@Override
public void insert() {
customDao.insert();
}
}
CustomController
package com.spring.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import com.spring.service.CustomService;
@Controller
public class CustomController {
@Autowired
private CustomService customService;
public void insert() {
customService.insert();
}
}
测试代码
@Test
public void testName() throws Exception {
//不使用@Import注解时,有多个配置类的时候,这样使用ApplicationContext applicationContext=new AnnotationConfigApplicationContext(SpringConfig.class,SpringConfig1.class);
//ApplicationContext applicationContext=new AnnotationConfigApplicationContext(SpringConfig.class,SpringConfig1.class);
//当在SpringConfig类上使用@Import注解导入其他配置类时,这样使用ApplicationContext applicationContext=new AnnotationConfigApplicationContext(SpringConfig.class);
ApplicationContext applicationContext=new AnnotationConfigApplicationContext(SpringConfig.class);
DataSource dataSource = applicationContext.getBean("getDataSource",DataSource.class);
Connection connection = dataSource.getConnection();
System.out.println(connection);
CustomController controller = applicationContext.getBean("customController", CustomController.class);
controller.insert();
//Object bean = applicationContext.getBean("getObject",Object.class);
}