SSM应用(二)--注解的使用
注解的概念
传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop、事物,这么做有两个缺点:
如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大;如果按需求分开.xml文件,那么.xml文件又会非常多。总之这将导致配置文件的可读性与可维护性变得很低。
在开发中在.java文件和.xml文件之间不断切换,是一件麻烦的事,同时这种思维上的不连贯也会降低开发的效率。
为了解决这两个问题,Spring引入了注解,通过"@XXX"的方式,让注解与Java Bean紧密结合,既大大减少了配置文件的体积,又增加了Java Bean的可读性与内聚性。
基于组件的注解
@Component:组件,标注一个普通的Spring bean类,取代了配置文件中的<bean id=”” class=””></bean>配置项;@Component是所有受Spring 管理组件的通用形式,@Component注解可以放在类的头上,@Component不推荐使用。如:
@Controller:控制器组件,针对于MVC中的C层,标注一个控制层的类(servlet);使用@Controller注解标识UserServlet之后,就表示要把UserServlet交给Spring容器管理,在Spring容器中会存在一个名字为"userServlet"的servlet,这个名字是根据UserServlet类名来取的。注意:如果@Controller不指定其value【@Controller】,则默认的bean名字为这个类的类名首字母小写,如果指定value【@Controller(value="UserServlet")】或者【@Controller("userServlet")】,则使用value作为bean的名字,如:
@Service:业务层组件,标注一个service层的类;@Service("userService")注解是告诉Spring,当Spring要创建UserServiceImpl的的实例时,bean的名字必须叫做"userService",这样当Servlet需要使用UserServiceImpl的的实例时,就可以由Spring创建好的"userService",然后注入给Servlet:在Servlet只需要声明一个名字叫"userService"的变量来接收由Spring注入的"userService"即可,具体代码如下:
@Repository:数据层组件,标注一个dao层的类;@Repository(value="userDao")注解是告诉Spring,让Spring创建一个名字叫"userDao"的UserDaoImpl实例。当Service需要使用Spring创建的名字叫"userDao"的UserDaoImpl实例时,就可以使用注解告诉Spring,Spring把创建好的userDao注入给Service即可。
属性注入、建立bean之间关系用到的注解
@Autowire:根据类型自动装配,可以和@Qualifier配合使用;其作用是为了消除代码Java代码里面的getter/setter与bean属性中的property。@Autowired默认按类型匹配的方式,在容器查找匹配的Bean,当有且仅有一个匹配的Bean时,Spring将其注入@Autowired标注的变量中。
@Qualifier:根据指定名称装配,属性名去找有没有对应的beanID,如果有就自动匹配,如:
@Resource:按名称装配,如果找不到与名称匹配的bean,则按类型装配;装配步骤如下:
@Resource后面没有任何内容,默认通过name属性去匹配bean,找不到再按type去匹配
指定了name和type则根据指定的name和type去匹配bean,任何一个不匹配都将报错
然后,区分一下@Autowired和@Resource两个注解的区别:
@Autowired默认按照byType方式进行bean匹配,@Resource默认按照byName方式进行bean匹配
@Autowired是Spring的注解,@Resource是J2EE的注解,这个看一下导入注解的时候这两个注解的包名就一清二楚了
Spring属于第三方的,J2EE是Java自己的东西,因此,建议使用@Resource注解,以减少代码和Spring之间的耦合。
@Value:给基本属性赋值,如:
关于扫描的注解
@Configuration:配置注解
@ComponentScan:配置要扫描的包,零配置
注:扫描注解后,所有的bean都存放在Spring容器中,根据属性注入的注解,再去Spring的内存中寻找是否有名称匹配或者类型匹配的bean,自动将该bean与属性建立关系
PS:因作者能力有限,如有误还请谅解