org.springframework spring-context 5.3.1 junit junit 4.12 test
控制层 com.atguigu.spring.controller.UserController
业务层 :com.atguigu.spring.service.UserService 接口
com.atguigu.spring.service.impl.UserServiceImpl 实现类
持久层:com.atguigu.spring.dao.UserDao 接口
com.atguigu.spring.dao.impl.UserDaoImpl 实现类
代码如下 :
控制层 com.atguigu.spring.controller.UserController
package com.atguigu.spring.controller;public class UserController {}
业务层 :com.atguigu.spring.service.UserService 接口
com.atguigu.spring.service.impl.UserServiceImpl 实现类
package com.atguigu.spring.service;public interface UserService {}
package com.atguigu.spring.service.impl;import com.atguigu.spring.service.UserService;public class UserServiceImpl implements UserService {}
持久层:com.atguigu.spring.dao.UserDao 接口
com.atguigu.spring.dao.impl.UserDaoImpl 实现类
package com.atguigu.spring.dao;public interface UserDao {}
package com.atguigu.spring.dao.impl;import com.atguigu.spring.dao.UserDao;public class UserDaoImpl implements UserDao {}
package com.atguigu.spring.test;import org.junit.Test;public class IOCByAnnotationTest {@Testpublic void test(){}
}
现在要做的事情就是通过注解来管理bean 那我们有哪些注解呢?
我们现在要把一个类交给IOC来管理 我们要用到以下四个注解
代码如下:
package com.atguigu.spring.controller;import org.springframework.stereotype.Controller;@Controller
public class UserController {}
package com.atguigu.spring.service.impl;import com.atguigu.spring.service.UserService;
import org.springframework.stereotype.Service;@Service
public class UserServiceImpl implements UserService {}
package com.atguigu.spring.dao.impl;import com.atguigu.spring.dao.UserDao;
import org.springframework.stereotype.Repository;@Repository
public class UserDaoImpl implements UserDao {}
注意:注解不能加到接口 一定要加到实现类上
因为加上注解的作用是: 加上注解的类在IOC容器中配置了一个当前类型的bean 一个bean的类型不能够是一个接口类型
为什么要扫描:
在类上加上注解 要想让spring知道 得要扫描 要让spring知道哪些类加上了注解 加了什么注解
因为一层一层的包 就是一层一层的目录 所以我们主要扫描包就可以
在理解一下 注解+扫描的意思:
它可以将我们扫描的包下 加上注解的这些类做为组件进行管理
做为组件进行管理:在IOC容器中就有了 当前加上这个注解 的这个类 所对应的bean对象
测试:
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class IOCByAnnotationTest {/* @Component:将类标识为普通组件* @Controller:将类标识为控制层组件* @Service:将类标识为业务层组件* @Repository:将类标识为持久层组件*/@Testpublic void test(){ApplicationContext ioc =new ClassPathXmlApplicationContext("spring-ioc-annotation.xml");UserController userCOntroller= ioc.getBean(UserController.class);System.out.println(userController);UserService userService = ioc.getBean(UserService.class);System.out.println(userService);UserDao userDao = ioc.getBean(UserDao.class);System.out.println(userDao);}
}
问题:
以后在ssm整合的时候 spring 和springmvc 是放在一块使用的 而springmvc要扫描的是我们的控制层,spring要扫描的是除控制层以外的所有组件 这个时候应该怎么办?
如果springmvc 把控制层给扫描了 spring也把控制层扫描了 这个时候一个组件就被扫描多次
我们现在要做的是 springmvc 扫描控制层 然后spring把其他的层给扫描了
就要用到排除扫描标签 具体如下
第一种 annotation:根据注解的类型进行排除,expression需要设置排除的注解的全类名(用得多)
测试:
@Testpublic void test(){ApplicationContext ioc =new ClassPathXmlApplicationContext("spring-ioc-annotation.xml");UserController userCOntroller= ioc.getBean(UserController.class);System.out.println(userController);UserService userService = ioc.getBean(UserService.class);System.out.println(userService);UserDao userDao = ioc.getBean(UserDao.class);System.out.println(userDao);}
}
虽然在控制层加了 但是因为排除了 所以并没有扫描到 但是不影响对其他层的扫描 如下 测试
@Testpublic void test(){ApplicationContext ioc =new ClassPathXmlApplicationContext("spring-ioc-annotation.xml");/* UserController userCOntroller= ioc.getBean(UserController.class);System.out.println(userController);*/UserService userService = ioc.getBean(UserService.class);System.out.println(userService);UserDao userDao = ioc.getBean(UserDao.class);System.out.println(userDao);}
全类名的复制方法;
要把控制层的扫描给排除掉 所以我们找到控制层 找到注解 点击右键 把全类名放过来 这个时候就不扫描控制层了
第二种 :assignable:根据类的类型进行排除,expression需要设置排除的类的全类名(用得少)
测试:
public class IOCByAnnotationTest {/* @Component:将类标识为普通组件* @Controller:将类标识为控制层组件* @Service:将类标识为业务层组件* @Repository:将类标识为持久层组件*/@Testpublic void test(){ApplicationContext ioc =new ClassPathXmlApplicationContext("spring-ioc-annotation.xml");UserController userCOntroller= ioc.getBean(UserController.class);System.out.println(userController);UserService userService = ioc.getBean(UserService.class);System.out.println(userService);UserDao userDao = ioc.getBean(UserDao.class);System.out.println(userDao);}
}
全类名的复制方法
我们找到控制层 找到UserController类 点击右键 把全类名放过来 这个时候在扫描包的时候就会把UserController类给排除
注意:以后用得比较多的是根据注解的方式排除 因为以后要用到这个标签 二种方法整合一起并解释: 总结: 测试: 测试结果发现都可以扫描到 修正如下: 测试: 总结: context:include-filter:包含扫描 二种方法全部总结: 我们以后排除扫描用得比较多 包含扫描用得比较少 因为麻烦 平常用的话只要下如下就可以 复习: 注解所标识的类交给IOC管理: 注解标识的类经过 扫描之后在IOC容器中 自动去配置一个相对应的bean 新知识: 问题:我们知道bean 都是有id的 通过注解+扫描的id是啥呢? 答案:通过注解+扫描所配置的bean的id,默认值为类的小驼峰,即类名的首字母为小写的结果 验证: IOCByAnnotationTest 自定义bean的id 可以通过标识组件的注解的value属性值设置bean的自定义的id UserController springmvc文件上传解析器 就是根据id来获取的 其他的地方一般用到的都是根据类型来获取
2 .包含扫描 只扫描
public class IOCByAnnotationTest {/* @Component:将类标识为普通组件* @Controller:将类标识为控制层组件* @Service:将类标识为业务层组件* @Repository:将类标识为持久层组件*/@Testpublic void test(){ApplicationContext ioc =new ClassPathXmlApplicationContext("spring-ioc-annotation.xml");UserController userCOntroller= ioc.getBean(UserController.class);System.out.println(userController);UserService userService = ioc.getBean(UserService.class);System.out.println(userService);UserDao userDao = ioc.getBean(UserDao.class);System.out.println(userDao);}
}public class IOCByAnnotationTest {/* @Component:将类标识为普通组件* @Controller:将类标识为控制层组件* @Service:将类标识为业务层组件* @Repository:将类标识为持久层组件*/@Testpublic void test(){ApplicationContext ioc =new ClassPathXmlApplicationContext("spring-ioc-annotation.xml");UserController userCOntroller= ioc.getBean(UserController.class);System.out.println(userController);UserService userService = ioc.getBean(UserService.class);System.out.println(userService);UserDao userDao = ioc.getBean(UserDao.class);System.out.println(userDao);}
}
注意:需要在context:component-scan标签中设置use-default-filters="false"
use-default-filters="true"(默认),所设置的包下所有的类都需要扫描,此时可以使用排除扫描
use-default-filters="false",所设置的包下所有的类都不需要扫描,此时可以使用包含扫描
三. 标记与扫描(基于注解管理bean之bean的id)
public class IOCByAnnotationTest {/* @Component:将类标识为普通组件* @Controller:将类标识为控制层组件* @Service:将类标识为业务层组件* @Repository:将类标识为持久层组件*/@Testpublic void test(){ApplicationContext ioc =new ClassPathXmlApplicationContext("spring-ioc-annotation.xml");UserController userCOntroller= ioc.getBean("userController",UserController.class);System.out.println(userController);UserService userService = ioc.getBean("userServiceImpl",UserService.class);System.out.println(userService);UserDao userDao = ioc.getBean("userDaoImpl",UserDao.class);System.out.println(userDao);}
}package com.atguigu.spring.controller;import org.springframework.stereotype.Controller;@Controller("controller")
public class UserController {}public class IOCByAnnotationTest {/* @Component:将类标识为普通组件* @Controller:将类标识为控制层组件* @Service:将类标识为业务层组件* @Repository:将类标识为持久层组件*/@Testpublic void test(){ApplicationContext ioc =new ClassPathXmlApplicationContext("spring-ioc-annotation.xml");UserController userCOntroller= ioc.getBean("controller",UserController.class);System.out.println(userController);UserService userService = ioc.getBean("userServiceImpl",UserService.class);System.out.println(userService);UserDao userDao = ioc.getBean("userDaoImpl",UserDao.class);System.out.println(userDao);}
}