V哥官网:http://www.vgxit.com
本博客对应视频教程:http://www.vgxit.com/course/23
混合装配
1,概述
之前的课程介绍了最基本的装配Bean方法,我们对XML的方式和注解的方式都进行了讲解。在现实中,使用XML或者注解各有道理,V哥建议在自己的工程中所开发的类尽量使用注解方式,因为使用它并不困难,甚至可以说更为简单,而对于引入第三方包的类,尽量使用XML方式,这样的好处是可以尽量对三方包或者服务的细节减少理解,也更加清晰和明朗。
但是V哥给大家说一下,现在我们使用的是混合装配的方式。不过之后大家学习了Spring boot之后,XML的方式基本上是不会再使用了。都是注解的方式。
2,具体操作(基于注解的方式)
我们按照真实开发项目的一个流程,来给大家演示一下从数据库里面查询所有的用户数据的这么一个流程。
1,首先,我们创建对应的PO:
package com.vgxit.learn.spring.ktdm.blendioc.po;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class User {
private Integer id;
private String name;
private Short gender;
private Integer age;
private String nickName;
}
2, 我们定义好对应的IUserService和UserService:
package com.vgxit.learn.spring.ktdm.blendioc.service;
import com.vgxit.learn.spring.ktdm.blendioc.po.User;
import java.sql.SQLException;
import java.util.List;
public interface IUserService {
List<User> all() throws SQLException;
}
package com.vgxit.learn.spring.ktdm.blendioc.service.impl;
import com.vgxit.learn.spring.ktdm.blendioc.po.User;
import com.vgxit.learn.spring.ktdm.blendioc.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
@Component
public class UserService implements IUserService {
@Autowired
private DataSource dataSource;
@Override
public List<User> all() throws SQLException {
Connection conn = dataSource.getConnection();
PreparedStatement ps = conn.prepareStatement("select * from user");
ResultSet rs = ps.executeQuery();
List<User> users = new ArrayList<>();
try (conn;ps;rs){
while (rs.next()) {
User user = User.builder()
.id(rs.getInt("id"))
.gender(rs.getShort("gender"))
.age(rs.getInt("age"))
.name(rs.getString("name"))
.nickName(rs.getString("nick_name"))
.build();
users.add(user);
}
}
return users;
}
}
3,定义一个Spring的配置文件,然后,其中配置druid对应的xml注入配置:
<?xml version="1.0" encoding="UTF-8" ?>
<!--存放bean的容器-->
<beans xmlns="http://www.springframework.org/schema/beans"
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">
<!--配置我们的数据源-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis.ktdm?serverTimezone=Asia/Shanghai"/>
<property name="username" value="root"/>
<property name="password" value="Abc@123456"/>
<property name="initialSize" value="1"/>
<property name="minIdle" value="1"/>
<property name="maxActive" value="20"/>
</bean>
</beans>
4,定义配置类,这里我们把扫描包调整到总包下面,还要在这个配置类下面引入对应的XML文件:
package com.vgxit.learn.spring.ktdm.blendioc.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ImportResource;
@ComponentScan(basePackages = "com.vgxit.learn.spring.ktdm.blendioc")
@ImportResource("classpath:spring-cfg.xml")//引入对应的xml配置文件
public class BlendiocConfig {
}
5,测试代码:
package com.vgxit.learn.spring.ktdm.blendioc.test;
import com.vgxit.learn.spring.ktdm.blendioc.config.BlendiocConfig;
import com.vgxit.learn.spring.ktdm.blendioc.po.User;
import com.vgxit.learn.spring.ktdm.blendioc.service.IUserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import java.sql.SQLException;
import java.util.List;
public class BlendiocTest001 {
public static void main(String[] args) throws SQLException {
ApplicationContext ctx = new AnnotationConfigApplicationContext(BlendiocConfig.class);
IUserService userService = ctx.getBean(IUserService.class);
List<User> users = userService.all();
users.forEach(System.out::println);
}
}
3,混合装配的第二种方式(基于xml的装配方式):
1,我们在xml中加上context的xsd文件,然后配置我们要扫描的包的路劲:
<?xml version="1.0" encoding="UTF-8" ?>
<!--存放bean的容器-->
<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
http://www.springframework.org/schema/context/spring-context.xsd">
<!--配置我们扫描包的路劲-->
<context:component-scan base-package="com.vgxit.learn.spring.ktdm.blendioc"/>
<!--配置我们的数据源-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis.ktdm?serverTimezone=Asia/Shanghai"/>
<property name="username" value="root"/>
<property name="password" value="Abc@123456"/>
<property name="initialSize" value="1"/>
<property name="minIdle" value="1"/>
<property name="maxActive" value="20"/>
</bean>
</beans>
2,加入我们的测试代码:
package com.vgxit.learn.spring.ktdm.blendioc.test;
import com.vgxit.learn.spring.ktdm.blendioc.po.User;
import com.vgxit.learn.spring.ktdm.blendioc.service.IUserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.sql.SQLException;
import java.util.List;
public class BlendiocTest001 {
public static void main(String[] args) throws SQLException {
ApplicationContext ctx = new ClassPathXmlApplicationContext("spring-cfg.xml");
IUserService userService = ctx.getBean(IUserService.class);
List<User> users = userService.all();
users.forEach(System.out::println);
}
}