Spring注解使用:
【步骤一】
定义注解扫描文件包
<context:component-scan base-package="com.jyk" ></context:component-scan>
【步骤二】
实体类添加注解 @Repository
@Repository
public class User extends ParUser{
private Integer id;
private String name;
private String password;
private String address;
private Address add;
public Address getAdd() {
return add;
}
public void setAdd(Address add) {
this.add = add;
}
public User() {
}
public User(Address add) {
this.add = add;
}
public User(Integer id, String name, String password, String address, Address add) {
this.id = id;
this.name = name;
this.password = password;
this.address = address;
this.add = add;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", password='" + password + '\'' +
", address='" + address + '\'' +
", add=" + add +
'}';
}
}
测试结果:
public class Testdemo {
public static void main(String[] args) throws SQLException {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("ioc.xml");
User user = applicationContext.getBean("user", User.class);
System.out.println(user);
}
}
完成自动注入过程
一般来说:
(1)@Service:放在业务逻辑层
(2)@Repository:放在数据库访问层
(3)@Controller:控制层
(4)@Component:组件,放在任意类上都可以bean注册
@Scope(value=“singleton”)可以是单例或者多例模式prototype
总结:
<context:component-scan base-package="com.jyk"></context:component-scan>
可以有很多的属性值设置:
(1)默认情况下全部扫描文件加,可以添加use-default-filter="false"关闭自动全部扫描
<!--排除包中的某些类-->
<context:exclude-filter type="" expression=""/>
<!--包括包中的某些类--->
<cotext:include-filter tyle="" expression=""/>
type:过滤的类型
(1)annotation:按照注解排除进行排除
(2)assinable:排除某一个具体的类,表达式时类的完全限定名
(3)aspectj:aspectj表达式
(4)custom:自定义排除规则
(5)regex:使用正则表达式
自动注入@Autowired
属性值的自动注入案例:
@Repository
public class UserDao {
public void save(){
System.out.println("保存");
}
}
@Controller
public class UserController {
//自动注入功能,原来我们时UserDao userDao = new UserDao(),现在我们交给IOC容器,帮助我们管理,我们需要的时候自动给我们创建对象即可
@Autowired
private UserDao userDao;
public void save(){
userDao.save();
}
}
执行结果
默认情况下时按照byType进行匹配的
如果有两个类型满足,则按照名称进行查找,如果名称对不上则会报错
测试用例
@Repository
public class UserDao {
public void save(){
System.out.println("保存test1");
}
}
@Repository
public class UserDao1 extends UserDao {
public void save(){
System.out.println("保存test2");
}
}
@Controller
public class UserController {
@Autowired
private UserDao userDao1;
public void save(){
userDao1.save();
}
}
证明结论,先按类型进行查找,类型匹配的话并且只有一个类型直接注入,如果有多个类型,则再按照名称进行查找,如果名称找不到则报错
可以使用注解@Qualifier方式规定使用的哪个类的名称测试结果如下:
@Resource按照名称进行装配,JDK注解,扩展性好
@Autowired时按照类型进行匹配,Spring注解,只适用于Spring框架
@AutoWired还适用于方法上,bean创建的时候会自动调用,方法的每一个参数都会有自动注入值
测试方法:
@Controller
public class UserController {
@Autowired
public void save(UserDao userDao){
userDao.save();
}
}
public class Testdemo {
public static void main(String[] args) throws SQLException {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("ioc.xml");
//UserDao userController = applicationContext.getBean( "userDao", UserDao.class);
//userController.save();
}
}
泛型自动注入
(1)创建实体类并注入容器
@Repository
public class Teacher {
}
@Repository
public class Student {
}
(2)dao层创建接口 BaseDao
public interface BaseDao <T>{
public void save();
}
(3)StudentDao实现类
@Repository
public class StudentDao implements BaseDao<Student> {
@Override
public void save() {
System.out.println("保存学生数据");
}
}
(4)TeacherDao实现类
@Repository
public class TeacherDao implements BaseDao<Teacher> {
@Override
public void save() {
System.out.println("保存老师数据");
}
}
(5)TeacherService类
@Service
public class TeacherService{
@Autowired
private TeacherDao teacherDao;
public void save(){
teacherDao.save();
}
}
(6)StudentService类
@Service
public class StudentService{
@Autowired
private StudentDao studentDao;
public void save(){
studentDao.save();
}
}
(7)测试
public class Testdemo {
public static void main(String[] args) throws SQLException {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("ioc.xml");
TeacherService teacherService = applicationContext.getBean("teacherService", TeacherService.class);
teacherService.save();
StudentService studentService = applicationContext.getBean("studentService",StudentService.class);
studentService.save();
}
}
思路如图所示:
第二种实现方式思路
(1)创建实体类并注入容器
@Repository
public class Teacher {
}
@Repository
public class Student {
}
(2)dao层创建接口 BaseDao
public interface BaseDao <T>{
public void save();
}
(3)StudentDao实现类
@Repository
public class StudentDao implements BaseDao<Student> {
@Override
public void save() {
System.out.println("保存学生数据");
}
}
(4)TeacherDao实现类
@Repository
public class TeacherDao implements BaseDao<Teacher> {
@Override
public void save() {
System.out.println("保存老师数据");
}
}
(5)BaseService接口(区别)
public class BaseService<T> implements BaseDao<T> {
@Autowired
private BaseDao<T> baseDao;
@Override
public void save() {
baseDao.save();
}
}
(6)StudentService类
@Service
public class StudentServiceDemo1 extends BaseService<Student> {
}
(7)TeacherService类
@Service
public class TeacherServiceDemo1 extends BaseService<Teacher>{
}
(8)测试类