(2)把外部 properties 属性文件引入到 spring 配置文件中 —— 引入 context 名称空间
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
3.6 注解方式实现Bean管理
3.6.1 什么是注解
(1)注解是代码特殊标记,格式: @注解名称(属性名称=属性值, 属性名称=属性值…)
(2)使用注解,注解作用在类上面,方法上面,属性上面
(3)使用注解目的:简化 xml 配置
3.6.2 Spring 针对 Bean 管理中创建对象提供注解
(1) @Component
(2) @Service
(3) @Controller
(4) @Repository
上面四个注解功能是一样的,都可以用来创建 bean 实例
3.6.3 基于注解方式实现对象创建
(a)开启组件扫描
1
2
3
4
5
6
(b)创建类,在类上面添加创建对象注解
//在注解里面 value 属性值可以省略不写,
//默认值是类名称,首字母小写
//UserService -- userService@Component(value = "userService") //
public class UserService {
public void add() {
System.out.println("service add.......");
}
}
1
2
3
4
5
6
7
8
(c)组件扫描的细节配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
(d)基于注解方式实现属性注入
@Autowired:根据类型注入
@Service
public class UserService {
//定义 dao 类型属性
//不需要添加 set 方法
//添加注入属性注解
@Autowired
private UserDao userDao;
public void add() {
System.out.println("service add.......");
userDao.add();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
@Qualifier:根据名称进行注入
这个@Qualifier 注解的使用,和上面@Autowired 一起使用
//定义 dao 类型属性
//不需要添加 set 方法
//添加注入属性注解
@Autowired //根据类型进行注入
@Qualifier(value = "userDaoImpl1") //根据名称进行注入
private UserDao userDao;
public interface UserDao {
public int add(int a,int b);
public String update(String id);
}
1
2
3
4
(2)创建接口实现类,实现方法
public class UserDaoImpl implements UserDao {
@Override
public int add(int a, int b) {
return a+b;
}
@Override
public String update(String id) {
return id;
} }
1
2
3
4
5
6
7
8
9
(3)使用 Proxy 类创建接口代理对象 简化版本:
public class JDKProxy {
public static void main(String[] args) {
//创建接口实现类代理对象
Class[] interfaces = {UserDao.class};
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return null;
}
});
}
}
//创建代理对象代码
class UserDaoProxy implements InvocationHandler {
//增强的逻辑
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//被增强的方法执行
Object res = method.invoke(obj, args);
return res;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
结合实际代码的复杂逻辑:
public class JDKProxy {
public static void main(String[] args) {
//创建接口实现类代理对象
Class[] interfaces = {UserDao.class};
//因为是有参构造,需要把参数传递过来
//因为是代理对象,所以类似之前的多态
UserDaoImpl userDao = new UserDaoImpl();
UserDao dao = (UserDao)Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new UserDaoProxy(userDao));
int result = dao.add(1, 2);
System.out.println("result:"+result);
}
}
//创建代理对象代码
class UserDaoProxy implements InvocationHandler {
//1 把创建的是谁的代理对象,把谁传递过来
//有参数构造传递
private Object obj;
public UserDaoProxy(Object obj) {
this.obj = obj;
}
//增强的逻辑
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//方法之前
System.out.println("方法之前执行...."+method.getName()+" :传递的参数..."+ Arrays.toString(args));
//被增强的方法执行
Object res = method.invoke(obj, args);
//方法之后
System.out.println("方法之后执行...."+obj);
return res;
}
}
@Test
public void testAopAnno() {
ApplicationContext context =
new ClassPathXmlApplicationContext("bean1.xml");
User user = context.getBean("user", User.class);
user.add();
}
1
2
3
4
5
6
7
4.6 AspectJ配置文件
配置文件一般很少用 一开始还是创建两个类,增强类和被增强类,创建方法
public class Book {
public void buy() {
System.out.println("buy.............");
}
}
public class BookProxy {
public void before() {
System.out.println("before.........");
}
}
1
2
3
4
5
6
7
8
9
10
11
主要区分是配置文件的不同和没有注解方式 下面主要讲解配置文件的格式
通过bean id class 创建对象
通过aop config的配置文件配置切入点(增加的类)以及切入面(增强的方法)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
配置类
1
2
3
4
5
6
7
8
9
测试类
@Test
public void testAopXml() {
ApplicationContext context =
new ClassPathXmlApplicationContext("bean2.xml");
Book book = context.getBean("book", Book.class);
book.buy();
}
@Service
public class UserService {
//注入dao
@Autowired
private UserDao userDao;
}
1
2
3
4
5
6
7
8
在dao中配置jdbcTemplate 对象 通过@Repository进行标识
@Repository
public class UserDaoImpl implements UserDao {
@Autowired
private JdbcTemplate jdbcTemplate;
1
2
3
4
5
5.1 JdbcTemplate 操作数据库(添加)
DaoImpl需要有jdbcTemplate对象,Service需要有Dao对象
(1)对应数据库的实体类
public class Book {
private String userId;
private String username;
private String ustatus;
@Override
public String toString() {
return "Book{" +
"userId='" + userId + '\'' +
", username='" + username + '\'' +
", ustatus='" + ustatus + '\'' +
'}';
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Book(String userId, String username, String ustatus) {
this.userId = userId;
this.username = username;
this.ustatus = ustatus;
}
public Book() {
}
public String getUstatus() {
return ustatus;
}
public void setUstatus(String ustatus) {
this.ustatus = ustatus;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
(2)编写Service和Dao
public interface BookDao {
public void add(Book book);
void delete(String id);
void update(Book book);
int selectCount();
Book selectBookInfo(String id);
List selectAllBook();
void batchAdd(List
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Repository
public class BookDaoImpl implements BookDao{
@Autowired
private JdbcTemplate jdbcTemplate;
}
1
2
3
4
5
@Service
public class BookService {
@Autowired
private BookDao bookDao;
//添加
public void add(Book book){
bookDao.add(book);
}
//删除
public void delete(String id){
bookDao.delete(id);
}
//修改
public void update(Book book){
bookDao.update(book);
}
//查询1
public int selectCount(){
return bookDao.selectCount();
}
//查询2
public Book selectBookInfo(String id){
return bookDao.selectBookInfo(id);
}
//查询3
public List selectAllBook(){
return bookDao.selectAllBook();
}
//批量添加
public void batchAdd(List batchArgs){
bookDao.batchAdd(batchArgs);
}
//批量修改
public void batchUpdateBook(List batchArgs){
bookDao.batchUpdateBook(batchArgs);
}
//批量删除
public void batchDeleteBook(List batchArgs){
bookDao.batchDeleteBook(batchArgs);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
@Repository
public class BookDaoImpl implements BookDao {
//注入 JdbcTemplate
@Autowired
private JdbcTemplate jdbcTemplate;
//添加的方法
@Override
public void add(Book book) {
//1 创建 sql 语句
String sql = "insert into t_book values(?,?,?)";
//2 调用方法实现
Object[] args = {book.getUserId(), book.getUsername(),book.getUstatus()};
int update = jdbcTemplate.update(sql,args);
System.out.println(update);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
测试类
@Test
public void testJdbcTemplate() {
ApplicationContext context =
new ClassPathXmlApplicationContext("bean1.xml");
BookService bookService = context.getBean("bookService",
BookService.class);
Book book = new Book();
book.setUserId("1");
book.setUsername("java");
book.setUstatus("a");
bookService.addBook(book);
}
1
2
3
4
5
6
7
8
9
10
11
12
5.2 JdbcTemplate 操作数据库(修改和删除)
使用JdbcTemplate 模板所实现的 “增删改” 都是调用了同一个 “update” 方法
//1、修改
@Override
public void updateBook(Book book) {
String sql = "update t_book set username=?,ustatus=? where user_id=?";
Object[] args = {book.getUsername(), book.getUstatus(),book.getUserId()};
int update = jdbcTemplate.update(sql, args);
System.out.println(update);
}
//2、删除
@Override
public void delete(String id) {
String sql = "delete from t_book where user_id=?";
int update = jdbcTemplate.update(sql, id);
System.out.println(update);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
5.3 JdbcTemplate 操作数据库(查询返回某个值)
//查询表记录数
@Override
public int selectCount() {
String sql = "select count(*) from t_book";
//queryForObject方法中:第一个参数代表--sql语句;第二个参数代表--返回类型class
Integer count = jdbcTemplate.queryForObject(sql, Integer.class);
return count;
}
1
2
3
4
5
6
7
8
5.4 JdbcTemplate 操作数据库(查询返回集合)
//所用场景:查询图书列表分页、、
//查询返回集合
@Override
public List findAllBook() {
String sql = "select * from t_book";
//调用方法
List bookList = jdbcTemplate.query(sql, new BeanPropertyRowMapper(Book.class));
return bookList;
}