1.首先我们要了解注解是什么
注解(annotation),是从jdk5.0引入的技术,它不但可以和注释(comment)一样对程序坐出解释,还可以被其他程序(如编译器等)通过反射机制(Reflection)读取,可以说,注解-反射是MyBatis与Spring等框架的基础。
那么Bean是什么
Java面向对象,对象有方法和属性,那么就需要对象实例来调用方法和属性(即实例化)。Bean是一个被实例化、组装、并通过SpringIoC容器所管理的对象,对于开发者来说,使用Spring框架主要做两件事:开发Bean,配置Bean。
接下来,我们开始通过项目学习Bean。
2.创建Spring web项目Spring2_2。
3.我们可以在pom.xml配置项中<修改spring-framework.version>的版本号。
<spring-framework.version>4.3.16.RELEASE</spring-framework.version>
4.pom.xml新配置更新项目。右键项目->Maven->Update Project...->在弹出的窗口点击OK按钮。
5.创建cn.edu.lntu.domain包。
6.在domain包下创建实体类Book。在Book类中添加
private String bookId;
private String bookName;
private Float bookPrice;
三个数据成员,并为它们生成相应的set和get方法,然后生成包含三个形参的构造函数。
在sts中,生成set和get方法的快捷方式是,右击代码区然后选择Source,不论是get和set方法,还是构造器(构造函数),这里都可以快捷创作。
代码:
package cn.edu.lntu.domain;
public class Book {
private String bookId;
private String bookName;
private Float bookPrice;
@Override
public String toString() {
return "Book [bookId=" + bookId + ", bookName = " + bookName + ", bookPrice = " + bookPrice +"] ";
}
public Book(String bookId, String bookName, Float bookPrice) {
this.bookId = bookId;
this.bookName = bookName;
this.bookPrice = bookPrice;
}
public String getBookId() {
return bookId;
}
public void setBookId(String bookId) {
this.bookId = bookId;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public Float getBookPrice() {
return bookPrice;
}
public void setBookPrice(Float bookPrice) {
this.bookPrice = bookPrice;
}
}
7.创建cn.edu.lntu.dao包。
8.在dao包下创建接口BookDao,并添加方法public List<Book> findBookList();,其中List类型选择java.util.List。
代码:
package cn.edu.lntu.dao;
import java.util.List;
import cn.edu.lntu.domain.Book;
public interface BookDao {
public List<Book> findBookList();
}
9.在dao包下创建BookDao实现类BookDaoImp,并加入@Repository(name="bookDao")注解,光标放到Repository,通过快捷键CTRL+SHIFT+M导包。
package cn.edu.lntu.dao;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Repository;
import cn.edu.lntu.domain.Book;
@Repository("bookDao")
public class BookDaoImp implements BookDao {
public List<Book> findBookList() {
// TODO Auto-generated method stub
System.out.println("————————调用 BookDaoImp1的findBoolList()方法————————");
List<Book> bookList = new ArrayList<Book>();
bookList.add(new Book("326201","Android应用开发实践教程",56.0f));
bookList.add(new Book("326202","IT项目管理",42.0f));
return bookList;
}
}
10.创建cn.edu.lntu.service包。
11.在service包下创建接口BookService,并添加方法public List<Book> searchBooks();。
代码:
package cn.edu.lntu.service;
import java.util.List;
import cn.edu.lntu.domain.Book;
public interface BookService {
public List<Book> searchBooks();
}
12.在service包下创建BookService实现类BookServiceImp,并加入@Service("bookService")注解。在类中定义BookDao类型的数据成员bookDao,并为其生成set方法。接下来给bookDao数据成员加上@Resource("bookDao")注解,表示该成员通过依赖注入实例化。
代码:
package cn.edu.lntu.service;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import cn.edu.lntu.dao.BookDao;
import cn.edu.lntu.domain.Book;
@Service("bookService")
public class BookServiceImp implements BookService {
public List<Book> searchBooks() {
// TODO Auto-generated method stub
System.out.println("————————调用 BookService的searchBooks()方法————————");
return bookDao.findBookList();
}
@Resource(name="bookDao")
BookDao bookDao;
//set和get方法
// public BookDao getBookDao() {
// return bookDao;
// }
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
}
13.创建cn.edu.lntu.controller包。
14.在controller包下创建控制器类BookController,并加入@Controller("bookController")注解。在类中定义BookService类型的数据成员bookService,并为其生成set方法。接下来给bookService数据成员加上@Resource(name="bookService")注解。
代码:
package cn.edu.lntu.controller;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Controller;
import cn.edu.lntu.domain.Book;
import cn.edu.lntu.service.BookService;
@Controller("bookController")
public class BookController {
@Resource(name="bookService")
BookService bookService;
public List<Book> findBookList(){
System.out.println("————————调用 Book Controller的findBoolList()方法————————");
return bookService.searchBooks();
};
//生成方法
// public BookService getBookService() {
// return bookService;
// }
public void setBookService(BookService bookService) {
this.bookService = bookService;
}
}
15.配置Bean。通过配置信息
<context:component-scan base-package="cn.edu.lntu.controller"/>
<context:component-scan base-package="cn.edu.lntu.service"/>
<context:component-scan base-package="cn.edu.lntu.dao"/>
Spring工厂会扫描三个包内所有代码文件,并根据注解建立Bean及Bean之间的依赖关系。
16.在cn.edu.lntu包下创建主类SpringAnnotationTest。
代码:
package cn.edu.lntu;
import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.edu.lntu.controller.BookController;
import cn.edu.lntu.domain.Book;
public class SpringAnnotationTest {
public static void main(String[] args) {
System.out.println("————————调用 main方法————————");
//初始化Spring容器,加载配置文件
//ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
@SuppressWarnings("resource")
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring/application-config.xml");
//获取BookController实例
BookController bookController = (BookController) applicationContext.getBean("bookController");
//调用BookController中的findBookList()方法
List<Book> bookList = bookController.findBookList();
System.out.println(bookList);
}
}
17.因为版本问题,可能会遇见输出结果出错的情况
为了解决这样的问题,我们需要在Book类中加入一个toString()函数
18.输出结果