新注解说明
@configuration
- 用于指定当前类是一个 spring 配置类;
- 相当于spring.xml配置文件。
@ComponenScan
- 用于扫描注解;
- 相当于<context:component-scan base-package=“xxx”>标签
@Bean
- 该注解只能写在方法上,表明使用方法创建一个对象,并且放入 spring 容器;
- 相当于标签
@PropertySource
- 用于加载properties文件;
- 相当于<context:property-placeholder location=“xxx.properties”>标签
@Import
- 用于导入其他配置类;
- 相当于标签
Spring纯注解开发
- 开发步骤
- ①定义service层及其实现子类
- ②定义dao层及其实现子类
- ③定义MySpringCoreConfiguration
- ④定义MySpringDaoConfiguration
- ⑤代码测试
- ①定义service层及其实现子类
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public List<User> selectUserList() throws Exception {
return userDao.selectUserList();
}
}
②定义dao层及其实现子类
@Repository
public class UserDaoImpl implements UserDao {
@Autowired
private QueryRunner queryRunner;
@Override
public List<User> selectUserList() throws Exception {
return queryRunner.query(
"select user_id userId,user_name userName, user_pwd userPwd from tb_user",
new BeanListHandler<>(User.class)
);
}
}
③定义MySpringCoreConfiguration
@Configuration
@ComponentScan("com.atguigu")//扫描注解
@Import(MySpringDaoConfiguration.class)
public class MySpringCoreConfiguration {
}
④定义MySpringDaoConfiguration
@Configuration
@PropertySource("jdbc.properties")
public class MySpringDaoConfiguration {
@Value("${driverClassName}")
private String driverClassName ;
@Value("${url}")
private String url ;
@Value("${user}")
private String user ;
@Value("${password}")
private String password ;
@Bean
public QueryRunner getQueryRunner(DataSource ds){
return new QueryRunner(ds);
}
@Bean
public DataSource getDataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driverClassName);
dataSource.setUrl(url);
dataSource.setUsername(user);
dataSource.setPassword(password);
return dataSource;
}
}
⑤代码测试
public class UserController {
public static void main(String[] args) throws Exception {
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MySpringCoreConfiguration.class);
UserService userService = applicationContext.getBean(UserService.class);
List<User> userList = userService.selectUserList();
System.out.println("userList = " + userList);
}
}```
```java
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = MySpringCoreConfiguration.class)
public class UserServiceTest {
@Autowired
private UserService userService ;
@Test
public void selectUserList() throws Exception {
List<User> userList = userService.selectUserList();
System.out.println("userList = " + userList);
}
}
注解开发的作用和弊端
总结
- 自定义类使用注解来处理
- 第三方类使用XML来处理
AOP
概述
- 概述
- AOP : aspect oritented programing : 面向切面编程
- AOP关注的是程序中的共性功能,开发时,将共性功能抽取出来制作成独立的功能模块,此 时原始功能中将不具有这些被抽取出的共性功能代码。在被抽取的共性功能的模块运行时 候,将共性功能模块也运行,即可完成原始的功能。
- 作用
- 在程序运行期间,不修改源码对已有方法进行增强。
- 好处
- 减少重复代码
- 提供程序效率
- 方便项目维护
AOP原理环境搭建
代码实现
public class UserServiceImpl implements UserService {
@Override
public void addUser() {
System.out.println("权限校验");
System.out.println("UserServiceImpl addUser");
System.out.println("日志记录");
}
@Override
public void deleteUser() {
System.out.println("权限校验");
System.out.println("UserServiceImpl deleteUser");
System.out.println("日志记录");
}
@Override
public void updateUser() {
System.out.println("UserServiceImpl updateUser");
}
@Override
public void selectUserList() {
System.out.println("UserServiceImpl selectUserList");
}
}
存在问题
- 将主要功能和辅助功能写到一块,不方便程序维护,增加程序的耦合性;
- 不满足单一职责原则。
动态代理之JDKProxy
- 概述
- 基于接口的代理类实现方案
- 开发步骤
- ①定义UserServiceJDKProxy工具类
- 获取代理类对象
- ②代码测试
- ①定义UserServiceJDKProxy工具类
- ①定义UserServiceJDKProxy工具类
public class UserServiceJDKProxy {
/**
* 获取UserService(被代理类)对象的代理类对象
*
* @param userService : 被代理类对象
* @return
*/
public static UserService createUserServiceJDKProxy(UserService userService) {
UserService proxy = (UserService) Proxy.newProxyInstance(
userService.getClass().getClassLoader(),//被代理类的类加载器
userService.getClass().getInterfaces(),//被代理类实现的所有接口
new InvocationHandler() {
//执行增强 (执行被代理类的方法)
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//Object proxy: 代理类对象
// Method method:被代理类的原始方法
// Object[] args:方法的实际参数
Object result = null;
if ("addUser".equals(method.getName()) || "deleteUser".equals(method.getName())) {
System.out.println("权限校验");
//执行被代理类的原始方法
result = method.invoke(userService, args);
System.out.println(