通过注解配置bean是一种使用注解来替代传统的XML配置方式,在Spring框架中定义和配置应用程序中的对象(即bean)。通过使用特定的注解,我们可以将Java类或方法标记为bean,并告诉Spring如何创建和管理它们。
使用注解配置bean的好处包括:
简化配置:相比传统的基于XML的配置方式,注解配置更简洁直观,可以更快速地定义和配置bean。
提高可读性:注解直接嵌入在Java类或方法中,可以更清晰地表达bean的属性和关系,提高了代码可读性。
减少依赖:不再依赖外部的XML配置文件,避免了配置文件的管理和部署问题。
提供更多功能:注解可以携带更多的元数据信息,比如事务配置、请求映射等,使得开发更加灵活和便捷。
通过使用各种注解,我们可以在类、字段、方法等级别上定义和配置bean,包括声明bean的类型、作用域、依赖关系等。这样,Spring容器就可以根据这些注解来自动实例化、装配和管理bean,简化了开发过程。
@Component 表示当前注解标识的是一个组件
@Controller 表示当前注解标识的是一个控制器,常用于Servlet类
@Service 表示当前注解标识的是一个处理业务逻辑的类,通常用于Service类
@Repository 表示当前注解标识的是一个持久化层的类,通常用于Dao类
在使用注解配置bean时,首先我们需要引入 spring-aop-5.3.8.jar 包
此包在spring的libs目录下
接下来我们创建几个类,并且给它们添加相应的注解
@Component
public class UserComponent {
}
@Repository
public class UserDao {
}
@Service
public class UserService {
}
@Controller
public class UserServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws javax.servlet.ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws javax.servlet.ServletException, IOException {
doPost(request,response);
}
}
创建好类之后,我们开始写xml配置
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.spring.component"/>
beans>
这样,我们就完成了通过注解配置bean,并且对注解进行了扫描
接下来看一下底层
可以看到,ioc容器中,已经有了这些类,默认的id是类名首字母小写
让我们写一个测试类测试一下吧!
@Test
public void beansByAnnotation(){
//创建容器
ApplicationContext ioc = new ClassPathXmlApplicationContext("beansByAnnotation.xml");
//得到对象
UserServlet userServlet = ioc.getBean("userServlet", UserServlet.class);
UserComponent userComponent = ioc.getBean("userComponent", UserComponent.class);
UserDao userDao = ioc.getBean("userDao", UserDao.class);
UserService userService = ioc.getBean("userService", UserService.class);
System.out.println(userComponent);
System.out.println(userServlet);
System.out.println(userDao);
System.out.println(userService);
}
Spring的ioc容器不能检查一个使用了@Controller注解的类到底是不是一个真正的控制器,注解的名称是用于程序员自己识别当前标识的是什么组件。也就是说spring的ioc容器只要检查到注解就会生成对象,但是这个注解的含义spring不会识别,注解是给程序员方便看的。
如果我们希望排除某个包/子包下的某种类型的注解,可以通过exclude-filter来指定
看一个例子
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.spring.component">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
context:component-scan>
beans>
这样配置过后,ioc容器就不会加载Service注解配置的类了
同理如果我们希望指定某个包/子包下的某种类型的注解,可以通过include-filter来指定。用这个属性有一个前提,需要把默认的use-default-filters设置为false
代码如下:
<context:component-scan base-package="com.spring.component" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
context:component-scan>
在配置注解时,可以通过value属性,指定id
@Repository(value = "userDao")