二、Spring相关的API
1、ApplicationContext的实现类
1.ClassPathXmlApplicationContext
它是从类的根路径下加载配置文件(推荐使用)
2.FileSystemXmlApplicationContext
它是从磁盘路径上加载配置文件,配置文件可以放在磁盘的任何位置
3.AnnotationConfigApplicationContext
当使用注解配置容器对象时,需要使用此类来创建Spring容器,它用来读取注解
下图为配置文件部署后的位置,位于classes目录下,故第一种方法的参数只需要填写文件名
2、getBean()的使用方法
当参数的类型为字符串型时,表示根据Bean的id从容器中获得Bean实例,返回Object类型,需要强转
当参数得类型为Class类型时,表示根据类型从从其中匹配Bean实例,不需要强转,当容器中相同类型得Bean有多个时会报错
为了避免出现多个同类型Bean时报错,可以同时传入字符串类型和Class类型,则不需要强转,又能精确匹配Bean,如下:
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml"); UserService userService = app.getBean("userService",UserService.class); userService.save();
三、Spring配置数据源(连接池)
1、数据源开发步骤
1.导入数据源的坐标和数据库驱动坐标
2.创建数据源对象
3.设置数据源的基本连接数据
4.使用数据源获取连接资源和归还连接资源
2、使用Spring配置数据源
可以将DataSource的创建交给Spring容器去完成
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property> <property name="url" value="jdbc:mysql://localhost:3306/movie"></property> <property name="username" value="root"></property> <property name="password" value="123456"></property> </bean> <bean i
public class DataSourceTest { @Test public void testDruid() throws SQLException { ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml"); DruidDataSource dataSource = app.getBean(DruidDataSource.class); DruidPooledConnection connection = dataSource.getConnection(); System.out.println(connection); } }
3、抽取JDBC配置文件
为了让配置文件各司其职,一般会把数据源的配置信息单独写在jdbc.propertie文件中,而不是直接写在Spring配置文件(虽然写在Spring也能完成解耦)
applicationContext.xml加载jdbc.properties配置文件获得连接信息
首先,需要引入context命名空间和约束路径
命名空间:xmlns:context=“http://www.springframework.org/schema/context”
约束路径:http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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:jdbc.properties"></context:property-placeholder> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="${driverClassName}"></property> <property name="url" value="${url}"></property> <property name="username" value="${jdbc.username}"></property> <property name="password" value="${password}"></property> </bean> </beans>
driverClassName=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/movie jdbc.username=root password=123456
tip:此处不能写为$username,否则会加载本机的用户名
四、Spring注解开发
1、Spring原始注解
Spring是轻代码而重配置的框架,配置比较繁重,影响开发效率,所以注解开发是一种趋势,注解代替xml配置文件可以简化配置,提高开发效率
Spring原始注解主要是替代的配置
置比较繁重,影响开发效率,所以注解开发是一种趋势,注解代替xml配置文件可以简化配置,提高开发效率
Spring原始注解主要是替代的配置
注解 | 说明 |
@Component | 使用在类上用于实例化Bean |
@Controller | 使用在web层类上实例化Bean |
@Service | 使用在service层类上实例化Bean |
@Repository | 使用在dao层类上实例化Bean |
@Autowired | 使用在字段上用于根据类型依赖注入 |
@Qualifier | 结合@Autowired一起使用用于根据名称进行依赖注入 |
@Resource | 相当于@Autowired+@Qualifier,按照名称进行注入 |
@Value | 注入普通属性 |
@Scope | 标注Bean的作用范围 |
@PostConstruct | 使用在方法上标注该方法是Bean的初始化方法 |
@PreDestory | 使用在方法上标注该方法时Bean的销毁方法 |
注意
使用注解进行开发时,需要在applicationContext.xml中配置组件扫描,作用是指定哪个包及其子包下的Bean需要进行扫描以便识别使用注解配置的类
<!--注解的组件扫描--> <context:component-scan base-package="cn.ken"></context:component-scan>
2、实例
Controller层
public class UserController { public static void main(String[] args) { ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml"); UserService bean = app.getBean(UserService.class); bean.save(); app.close(); } }
使用ClassPathXmlApplicationContext而不是ApplicationContext类,以便调用close方法,才能看到销毁过程
Service层
//@Component("userService") @Service("userService")//参数为该Bean的id @Scope("singleton") public class UserServiceImpl implements UserService { @Value("${driverClassName}")//在容器中寻找key为driverClassName的键值对 private String driver; @Autowired //@Qualifier("userDao") private UserDao userDao; //public void setUserDao(UserDao userDao) { // this.userDao = userDao; //} @Override public void save() { userDao.save(); } @PostConstruct public void init(){ System.out.println("初始化中:driver=" + driver); } @PreDestroy public void destroy(){ System.out.println("销毁中"); } }
@Autowired注解会按照数据类型从Spring容器中自动进行匹配,如果UserDao只有一个实现的Bean,则@Qualifier注解可以省略
即@Autowired是按照类型自动匹配的,@Qualifier是按照id进行匹配的(当有多个实现的Bean时就需要加上这个注解来选择使用哪个Bean注入,且此注解不能单独使用,得配合@Autowired一起使用)
当需要通过id匹配时也可以直接使用@Resource注解,则直接写@Resource(name="userDao")就行(相当于@Autowired + @Qualifier(“userDao”))
如果使用注解配置可以不用set方法,注解标志处会通过暴力反射直接为该field赋值,不需要set方法
Dao层
//@Component("userDao") @Repository("userDao") public class UserDaoImpl implements UserDao { @Override public void save() { System.out.println("saving..."); } }
输出结果
初始化中:driver=com.mysql.cj.jdbc.Driver saving... 销毁中
3、Spring新注解
使用上面注解还不能全部替代xml配置文件,还需要使用注解替代的配置如下:
- 非自定义的Bean的配置:
- 加载properties文件的配置:
- 组件扫描的配置:
- 引入其他文件:
注解 | 说明 |
@Configuration | 用于指定当前类是一个Spring配置类,当创建容器时会从该类上加载注解 |
@ComponentScan | 用于指定Spring在初始化容器时需要扫描的包 |
@Bean | 使用在方法上,标注该方法的返回值存储到Spring容器中 |
@PropertySource | 用于加载.properties文件中的配置 |
@Import | 用于导入其他配置类 |
4、使用新注解取代xml文件
public class Main { public static void main(String[] args) { ApplicationContext app = new AnnotationConfigApplicationContext(SpringConfiguration.class); UserService userService = app.getBean("userService", UserService.class); userService.test(); } }
//标志该类是Spring的核心配置类即applicationContext.xml @Configuration //注解的组件扫描 //<=><context:component-scan base-package="cn.ken"></context:component-scan> @ComponentScan("cn.ken") //引入其他配置文件 //<=>import resource="applicationContext-xxx.xml" @Import({DataSourceConfiguration.class,XxxConfiguration.class}) public class SpringConfiguration { }
//加载properties文件中的配置 //<=><context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder> @PropertySource("classpath:jdbc.properties") public class DataSourceConfiguration { @Value("${driverClassName}") private String driver; @Value("${url}") private String url; @Value("${jdbc.username}") private String username; @Value("${password}") private String password; @Bean("dataSource") public DataSource getDataSource(){ DruidDataSource dataSource = new DruidDataSource(); dataSource.setDriverClassName(driver); dataSource.setUrl(url); dataSource.setUsername(username); dataSource.setPassword(password); return dataSource; } }