https://www.cnblogs.com/clamp7724/p/11757304.html
之前做的ssm结构的小练习,结合这个看比较好。
1.
@Controller
控制器, 添加给controller(servlet)层
2.
@Service
服务,添加给service(业务逻辑)层
3.
@Repository
储存库,添加给数据库(持久化,dao)层
4.
@Component
组件,给其他(不属于以上3种)的层
spring配置文件中,加入
<!-- 配置spring创建容器时要扫描的包,扫描注解, base-package的值是需要扫描的包名 --> <context:component-scan base-package="com.itheima"> </context:component-scan>
spring在启动时会扫描src下,com.itheima包中有以上注解的类,然后代理类,加入到ioc容器中(4种注解乱加也都可以生成bean使用,但是为了可读性所以最好对应加)。
生成的bean的id(类的对象的变量名)是类名首字母小写。
单例模式。
注解后面可以跟参数,类型是String,自定义bean的id e.g. @Controller("aaa")
5.
@scope(value = "prototype")
class上面加上这个注解,表示这个class生成多实例。
6.
spring配置文件中:
可以在context:component-scan中添加额外条件
<!-- 配置spring创建容器时要扫描的包,扫描注解, base-package的值是需要扫描的包名 --> <context:component-scan base-package="com.itheima"> <!--制定扫包规则,扫描@Server注解的JAVA类 --> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Server" /> <!--制定扫包规则,不扫描@Controller注解的JAVA类,其他的还是要扫描 --> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
type = annotation 按照注解注解筛选
type = assignable 按照类名筛选
7.
@autowired
自动注入 (也叫依赖注入,自动装配等,其实就是自动赋值 - -,spring的主要功能之一)
通过反射生调用到get,set方法,自动生成对象然后赋值。
@Autowired //自动注入,取到spring创建的代理对象,对业务层进行操作。 spring的ioc容器会先匹配类型,
//如果有多个(继承),匹配变量名是不是类名的小写,所以这里最好规范写。
//如果ioc中有多个AccountService类型的bean,同时名字也匹配不到,会直接报错。 private AccountService accountService; @RequestMapping("findAll") public ModelAndView findAll(){ ModelAndView mav = new ModelAndView(); mav.setViewName("findAllAccount"); List<Account> accountList = accountService.findAll(); mav.addObject("accountList", accountList); return mav; }
@autowired(required = false)
找不到直接赋值null,不会报错了- - 不过一般不会这么干。。。编译没错误,但是业务逻辑错误了
8.
qualifier("指定的变量名")
@Autowired //自动注入,取到spring创建的代理对象,对业务层进行操作。 spring的ioc容器会先匹配类型,
@Qualifier("accountService") //加上这个可以指定在ioc中对应的bean, 下面的变量名可以随便写了- -不过基本不会这么干 private AccountService accountServiceExt;
9.
@Resource
也可以用来自动装配,不过是javaEE中自带的,autowired是spring框架中提供的,功能更强大(比如autowired可以设置required = false来默认是null,Resource中没有这个参数)
但是因为是java自带,属于标准注解,扩展性和兼容性更好(不依赖于spring框架)。