IOC相关(二)
管理第三方的Bean(也就是其他人给我们定义的Bean类型,例如Druid,WebMvc)
例如:druid的数据源配置
<bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSource">
</bean>
DruidDataSource中需要配置数据源的属性,才能知道访问的是哪个数据库,提供驱动类型,账户名,密码等属性。
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/spring_db"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
运行结果:
{
CreateTime:"2022-04-23 20:48:16",
ActiveCount:0,
PoolingCount:0,
CreateCount:0,
DestroyCount:0,
CloseCount:0,
ConnectCount:0,
Connections:[
]
}
加载Properties
原因:druid中的属性有时候需要改动,则还需要去改properties中的值,非常不方便,而且可以倒是运行错误,所以专门用一个peoperties文件来对其中的属性进行赋值,然后用${**}来获取值。
注:propertioes中的值在xml文件中都可以用¥{**}读取值。
步骤:1,开辟命名空间
2,配置读取文件的位置
<!-- 1,创建命名空间-->
<!-- xmlns:context="http://www.springframework.org/schema/context"-->
<!-- http://www.springframework.org/schema/context-->
<!-- http://www.springframework.org/schema/context/spring-context.xsd-->
<!-- 2,配置属性占位符读取文件的位置-->
<context:property-placeholder location="classpath:*.properties"/>
*system-properties-mode="NEVER属性是环境属性是否开启,默认是开启的,所以peoperties中如果直接用username,或者password作为属性名,会与环境属性中的username冲突。
classpath知识点:参考类文件路径一classpath - LittleDonkey - 博客园 (cnblogs.com)
可以将target下的classes路径作为参考。
容器:
ApplicationContext context = new ClassPathXmlApplicationContext("springcontent.xml");
ApplicationContext context1 new ClassPathXmlApplicationContext("E:\\Sping相关\\spring_lessons\\Class2\\src\\main\\resources\\springcontent.xml");
两种方法都可以你第一种按照名称加载,第二种是按照绝对路径查找。这两种都是初始化容器的方式。
*还可以加载多个配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("springcontent.xml","springcontent1.xml");
注解开发:
定义为Bean:
//定义为组件,交给容器管理,默认名称为userDao,首字母小写
@Component
public class UserDao {
}
//开启组件扫描
<context:component-scan base-package="com.wlb"/>
完全注解开发:
@Configuration //定义为配置类
@ComponentScan("com.wlb")
@PropertySource({"application.properties","application.properties"}) //value的值都是用数组类型,无法使用*等占位符
public class SpringConfig {
}
不同点就是xml的文件配置用配置类代替,初始化容器用ApplicationContext下面实现类AnnotationConfigApplicationContext去加载配置类
ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
依赖注入:只需要在注入类的类名上架@Autwired,可以不加set方法,默认是按照类型装配,类型相同在按照名称注入。
@Autowired
@Qualifier("userDao") //指定需要装配的名称
private UserDao userDao;
简单类型注入:
@Value("张三")
private String name;
管理第三方bean:
定义dataSource为第三方bean:
@PropertySource("classpath:druid.properties")
public class DruidConfig {
@Value("${jdbc.DriverClassName}")
private String driverClassName;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
@Bean //创建为第三方bean
public DataSource dataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driverClassName);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
}
导入配置类:
@Configuration //定义为配置类
@ComponentScan("com.wlb")
@Import(DruidConfig.class)
//@PropertySource({"application.properties","application.properties"}) //value的值都是用数组类型,无法使用*等占位符
public class SpringConfig {
}
Spring整合mybatis:
配置类:
package com.wlb.config;
import com.alibaba.druid.pool.DruidDataSource;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
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.PropertySource;
import javax.sql.DataSource;
@Configuration //声明该类是核心配置类
@ComponentScan("com.wlb") //开启spring注解扫描
@PropertySource("classpath:db.properties") //引入properties文件
@MapperScan("com.wlb.dao") //MyBatis扫描dao接口
public class SpringConfig {
//定义属性 为属性注入数据(数据的来源上面引入的db.properties文件)
@Value("${db.driverClass}")
private String driverClass;
@Value("${db.url}")
private String url;
@Value("${db.username}")
private String username;
@Value("${db.password}")
private String password;
//创建数据源返回数据源,Spring会自动调用该方法,并将该对象交给IOC容器管理
@Bean
public DataSource dataSource(){
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setDriverClassName(driverClass);
druidDataSource.setUrl(url);
druidDataSource.setUsername(username);
druidDataSource.setPassword(password);
return druidDataSource;
}
//创建SqlSessionFactoryBean对象,设置形参,Spring会自动去调用IOC容器中已有的数据源
@Bean
public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource){
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
return sqlSessionFactoryBean;
}
}