1.spring设置JDBC链接池
classpath:jdbc.properties是有多个连接池时的写法,一般都用这种
还有就是配置文件里不要直接使用username,会被覆盖
使用${}来从文件里读取属性
<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 https://www.springframework.org/schema/context/spring-context.xsd">
<!--1. 加载jdbc.properties配置文件
如果需要使用properties文件的值: ${properties的key}
注意:spring在启动的时候是会读取你的系统的用户名,并且使用username作为用户名的key。
所以就会出现覆盖你的用户名。
解决方案:
方案一:system-properties-mode="NEVER" 不使用系统的用户名
方案二:你的properties的username不要使用username,换一个名字。
-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!--连接池是需要设置JDBC四大链接参数
驱动类
url
账号
密码
-->
<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>
<!--c3p0连接池-->
<bean id="c3p0DataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
</beans>
加载多个配置文件
ApplicationContext ctx = new ClassPathXmlApplicationContext("bean1.xml", "bean2.xml");
2.创建容器的方式
方式一:类路径加载配置文件
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
方式二:文件路径加载配置文件
ApplicationContext ctx = new FileSystemXmlApplicationContext("D:\\applicationContext.xml");
/*
容器类型:
-----| ApplicationContext 所有spring的容器的根接口
--------------| ClasspathXmlApplicationContext 类路径方式查找配置文件容器
--------------| FileSystemXmlApplicationContext 使用配置文件的绝对路径方式去查找
--------------| AnnotationConfigApplicationContext 加载注解的配置类创建的容器,目前还没有办法给大家演示,等会就行
*/
public class ApplicationContextTest {
@Test
public void testGetDataSource() throws SQLException {
//1. 创建spring容器
//类路径方式查找配置文件容器
// ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//文件的绝对路径查找配置文件,创建spring容器
// FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext("G:/applicationContext.xml");
//注解配置类
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
//2. 从容器中查找对象
DataSource dataSource = context.getBean("dataSource", DataSource.class);
System.out.println("connection:"+ dataSource.getConnection());
//3. 关闭容器
context.close();
}
}
public class AppTest {
@Test
public void testGetDataSource() throws SQLException {
//1. 创建spring容器
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//2. 从容器中查找对象
DataSource dataSource = context.getBean("dataSource", DataSource.class);
System.out.println("connection:"+ dataSource.getConnection());
//3. 关闭容器
context.close();
}
@Test
public void testC3p0GetDataSource() throws SQLException {
//1. 创建spring容器
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//2. 从容器中查找对象
DataSource dataSource = context.getBean("c3p0DataSource", DataSource.class);
System.out.println("connection:"+ dataSource.getConnection());
//3. 关闭容器
context.close();
}
}
3.获取bean的方式,一般使用第二种
方式一:使用bean名称获取
BookDao bookDao = (BookDao) ctx.getBean("bookDao");
方式二:使用bean名称获取并指定类型
BookDao bookDao = ctx.getBean("bookDao", BookDao.class);
方式三:使用bean类型获取
BookDao bookDao = ctx.getBean(BookDao.class);
4.容器相关总结
BeanFactory是IoC容器的顶层接口,初始化BeanFactory对象时,加载的bean延迟加载
ApplicationContext接口是Spring容器的核心接口,初始化时bean立即加载
ApplicationContext接口提供基础的bean操作相关方法,通过其他接口扩展其功能
ApplicationContext接口常用初始化类
ClassPathXmlApplicationContext
FileSystemXmlApplicationContext
依赖注入相关
5.注解开发
使用注解定义Bean:
Spring提供@Component注解的三个衍生注解,实际效果一样都是创建对象,名字不同是为了可读性
@Controller:用于表现层bean定义
@Service:用于业务层bean定义
@Repository:用于数据层bean定义
同时使用这种方式注解配置类还要更换new的对象
public class AppTest {
@Test
public void test01() throws SQLException {
//创建容器
AnnotationConfigApplicationContext configApplicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);
//2, 从spring的容器中查找对象
DataSource dataSource = configApplicationContext.getBean("dataSource", DataSource.class);
System.out.println("链接:"+ dataSource.getConnection());
}
}
/*
@Service 的作用就是相当于bean标签一样。
<bean id="bookDao1" class="com.itheima.service.impl.BookServiceImpl"/>
注意: 使用@Repository @Service、@Controller、@Component注解创建类的对象的时候都可以指定该对象在容器中的id。
如果你不指定,默认id就是当前类的类名,而且首字母小写。
*/
@Service("bookService")
@Scope("singleton") //指定作用范围: singleton(单例)与prototype(多例)
public class BookServiceImpl implements BookService {
//根据类型从容器查找合适对象给该变量注入,而且自动注入不依赖setter方法,也不依赖构造方法
/*
注意: 使用 @Autowired根据类型自动注入 的时候,如果spring的容器中存在多个相同类型的对象
那么优先使用名字与该属性名一样对象。 如果你需要指定注入某一个对象,那么需要配合@Qualifier注解
去使用,@Qualifier注解可以指定名字去注入,但是@Qualifier一定不能单独使用,需要配合@Autowired使用
*/
@Autowired
@Qualifier("bookDao2")
private BookDao bookDao;
//创建对象后调用
@PostConstruct //该注解的作用相当于以前 init-method= , 创建对象后调用
public void init(){
System.out.println("对象已经创建了,init方法被调用了...");
}
@PreDestroy //销毁对象前调用的, 相当于以前destroy-method
public void destroy(){
System.out.println("对象已经被销毁了,destroy方法已经被调用了..");
}
@Override
public void save() {
bookDao.save();
System.out.println("service:保存图书..");
}
}
bean作用范围
bean生命周期
6.依赖注入
@PropertySource("classpath:jdbc.properties")
public class JdbcConfig {
//从配置你文件读取value使用@Value注解
@Value("${jdbc.driver}")
private String driver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
/*
如果需要创建第三方bean对象,并且放入到spring 容器中,需要创建一个方法去创建
@bean注解的作用:
1. 添加@Bean注解的方法会自动调用
2. 方法的返回值对象会进入到spring的容器中,
*/
@Bean("dataSource")
public DataSource createDataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driver);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
}
引入另外一个配置类:
@Configuration //表示该类是一个注解的配置类
@Import(JdbcConfig.class) //@Import 引入另外一个配置类
public class SpringConfig {
}