3.7 Bean的依赖注入的数据类型
上面的操作,都是注入的引用Bean,处了对象的引用可以注入,普通数据类型,集合等都可以在容器中进行注入。
注入数据的三种数据类型
- 普通数据类型
- 引用数据类型
- 集合数据类型
其中引用数据类型,此处就不再赘述了,之前的操作都是对UserDao对象的引用进行注入的,下面将以set方法注入为例,演示普通数据类型和集合数据类型的注入。
Bean的依赖注入的数据类型
3.7.1 普通数据类型的注入
public class UserDaoImpl implements UserDao { String username; String age; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } @Override public String toString() { return "UserDaoImpl{" + "username='" + username + '\'' + ", age='" + age + '\'' + '}'; } }
<bean id="userDao" class="com.terence.dao.impl.UserDaoImpl"> <property name="username" value="传智播客"></property> <property name="age" value="15"></property> </bean>
3.7.2 集合数据类型(List<String>)的注入
public class UserDaoImpl implements UserDao { List<String> strList; public List<String> getStrList() { return strList; } public void setStrList(List<String> strList) { this.strList = strList; } }
<bean id="userDao" class="com.terence.dao.impl.UserDaoImpl"> <property name="strList"> <list> <value>aaa</value> <value>bbb</value> <value>ccc</value> </list> </property> </bean>
3.7.3 集合数据类型(List<User>)的注入
public class UserDaoImpl implements UserDao { List<User> userList; public List<User> getUserList() { return userList; } public void setUserList(List<User> userList) { this.userList = userList; } }
<bean id="u1" class="com.terence.domain.User"/> <bean id="u2" class="com.terence.domain.User"/> <bean id="userDao" class="com.terence.dao.impl.UserDaoImpl"> <property name="userList"> <list> <bean class="com.terence.domain.User"/> <bean class="com.terence.domain.User"/> <ref bean="u1"/> <ref bean="u2"/> </list> </property> </bean>
3.7.4 集合数据类型( Map<String,User> )的注入
public class UserDaoImpl implements UserDao { Map<String, User> userMap; public Map<String, User> getUserMap() { return userMap; } public void setUserMap(Map<String, User> userMap) { this.userMap = userMap; } }
<bean id="u1" class="com.terence.domain.User"> <property name="name" value="tom"/> <property name="addr" value="beijing"/> </bean> <bean id="u2" class="com.terence.domain.User"> <property name="name" value="lucy"/> <property name="addr" value="tianjin"/> </bean> <bean id="userDao" class="com.terence.dao.impl.UserDaoImpl"> <property name="userMap"> <map> <entry key="user1" value-ref="u1"></entry> <entry key="user2" value-ref="u2"></entry> </map> </property> </bean>
3.7.5 集合数据类型(Properties)的注入
public class UserDaoImpl implements UserDao { Properties properties; public Properties getProperties() { return properties; } public void setProperties(Properties properties) { this.properties = properties; } }
<bean id="userDao" class="com.terence.dao.impl.UserDaoImpl"> <property name="properties"> <props> <prop key="p1">aaa</prop> <prop key="p2">bbb</prop> <prop key="p3">ccc</prop> </props> </property> </bean>
3.8 引入其他配置文件(分模块开发)
实际开发中,Spring的配置内容非常多,这就导致Spring配置很繁杂且体积很大,所以,可以将部分配置拆解到其他配置文件中,而在Spring主配置文件通过import标签进行加载
<import resource="applicationContext-xxx.xml"/>
4. spring相关API
4.1 ApplicationContext的继承体系
applicationContext:接口类型,代表应用上下文,可以通过其实例获得 Spring 容器中的 Bean 对象
4.2 ApplicationContext的实现类
4.2.1 ClassPathXmlApplicationContext
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
它是从类的根路径下加载配置文件 推荐使用这种
4.2.3 AnnotationConfigApplicationContext
当使用注解配置容器对象时,需要使用此类来创建 spring 容器。它用来读取注解。
4.3 getBean()方法使用
public Object getBean(String name) throws BeansException { assertBeanFactoryActive(); return getBeanFactory().getBean(name); } public <T> T getBean(Class<T> requiredType) throws BeansException { assertBeanFactoryActive(); return getBeanFactory().getBean(requiredType); }
其中,当参数的数据类型是字符串时,表示根据Bean的id从容器中获得Bean实例,返回是Object,需要强转。
当参数的数据类型是Class类型时,表示根据类型从容器中匹配Bean实例,当容器中相同类型的Bean有多个时,则此方法会报错
getBean()方法使用
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); UserService userService1 = (UserService) applicationContext.getBean("userService"); UserService userService2 = applicationContext.getBean(UserService.class);
5.Spring配置数据源
5.1 数据源(连接池)的作用
数据源(连接池)是提高程序性能如出现的
事先实例化数据源,初始化部分连接资源
使用连接资源时从数据源中获取
使用完毕后将连接资源归还给数据源
常见的数据源(连接池):DBCP、C3P0、BoneCP、Druid等
开发步骤
①导入数据源的坐标和数据库驱动坐标
②创建数据源对象
③设置数据源的基本连接数据
④使用数据源获取连接资源和归还连接资源
5.2 数据源的手动创建
①导入mysql数据库驱动坐标、导入c3p0和druid的坐标
<dependencies> <!-- mysql驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.39</version> </dependency> <!-- C3P0连接池 --> <dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>0.9.1.2</version> </dependency> <!-- Druid连接池 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.10</version> </dependency> <!-- junit单元测试 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies>
②创建C3P0连接池
@Test public void testC3P0() throws Exception { //创建数据源 ComboPooledDataSource dataSource = new ComboPooledDataSource(); //设置数据库连接参数 dataSource.setDriverClass("com.mysql.jdbc.Driver"); dataSource.setJdbcUrl("jdbc:mysql://192.168.1.55:3306/mysql"); dataSource.setUser("root"); dataSource.setPassword("646453"); //获得连接对象 Connection connection = dataSource.getConnection(); System.out.println(connection); connection.close(); }
@Test public void testDruid() throws Exception { //创建数据源 DruidDataSource dataSource = new DruidDataSource(); //设置数据库连接参数 dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://192.168.1.55:3306/mysql"); dataSource.setUsername("root"); dataSource.setPassword("646453"); //获得连接对象 Connection connection = dataSource.getConnection(); System.out.println(connection); }
③提取jdbc.properties配置文件
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://192.168.1.55:3306/mysql jdbc.username=root jdbc.password=646453
④读取jdbc.properties配置文件创建连接池
@Test public void testC3P0ByProperties() throws Exception { //加载类路径下的jdbc.properties ResourceBundle rb = ResourceBundle.getBundle("jdbc"); ComboPooledDataSource dataSource = new ComboPooledDataSource(); dataSource.setDriverClass(rb.getString("jdbc.driver")); dataSource.setJdbcUrl(rb.getString("jdbc.url")); dataSource.setUser(rb.getString("jdbc.username")); dataSource.setPassword(rb.getString("jdbc.password")); Connection connection = dataSource.getConnection(); System.out.println(connection); }