通过配置组件扫描,可以使得spring自动扫描package,而不必在spring的配置文件中逐一声明各个 <bean>
在配置组件扫描时,指定的包是“根包”,即例如指定了 cn.tedu.spring
,spring不只会扫描这个包,还会扫描它的各个层级子包,例如: cn.tedu.spring.dao
直接在spring的配置文件中开启组件扫描即可 <context:component-scan base-package="cn.tedu.spring"></context:component-scan>
注意: 仅仅开启组件扫描 spring
是不会自动管理bean的,而是自动的扫描 package
,要想自动管理bean,那么还需要配置注解
在类的声明上方添加 @Component
注解,可以是的spring知道这个类是一个组件,需要进行管理,所以如过某个类需要被Spring管理,应该将这个类放在被扫描的包中,并且添加注解
由Spring扫描到的组件(由 @Component
注解标记的类),会由Spring自动设置 Bean Id
,值为将 类名首字母小写
的名称,例如组件类的名称是 UserDao
,则配置的Bean的id是 userDao
,如果需要自定义Bean,那么可以直接在注解中设置,比如 @Component("id")
可以混用,暂时这几个注解没有差异,完全功能相同,但是我们还是要根据规则使用
@Component
: 通用注解
@Service
: 用于对业务逻辑类的注解(Service层) @Controller
: 用于对控制器类的注解 @Repository
:用于对持久层处理类的注解(Dao层)
@Named
:通用注解(不用)
以上5个注解从实现目标和效果是等效的,但是基于方便理解代码的目的,应该按需使用,了;例如对名为 UserService
类的,应该使用 @Service
@Scope("prototype")
表示非单例,默认是单例 @Lazy("true")
用于设置成懒加载 /** * 初始化方法: 应该是public的,无返回参数,无参数的 */ @PostConstruct //定义初始化方法,在构造方法之后执行 public void init(){ System.out.println("初始化方法"); }
@PreDestroy //定义销毁方法 public void destroy(){ System.out.println("销毁方法"); }
在类中,在声明属性的上方添加 @Autowired
,用于标记该属性是自动装配值
这种自动装配默认按照类型( byType
)实现自动装配
如果需要按照名称(byName)来自动装配,还需要使用 @Qualifier("userDao")
来组合使用,注解中配置的名称是需要注入的值的 Bean-Id
UserDao
@Repository("userDao") public class UserDaoImpl implements UserDao{ public void reg() { System.out.println("reg"); } }
UserService
@Service public class UserService{ @Autowired @Qualifier("userDao") private UserDao userDao; public void reg(){ userDao.reg(); } }
@Resource //这里会先自动匹配和属性名一样的Bean Id,如果没有匹配到,那么就按照类型进行匹配 private UserDao userDao;
@Resource(name="userDaoImpl")
,name属性指定的是 Bean Id
,添加了name属性,那么只是按照名称来装配,如果这个名称对应的Bean不存在,那么就注入失败
@Resource(name="userDaoImpl") //这里只会匹配Bean Id为userDaoImpl的,如果匹配不上,那么报异常 private UserDao userDao;
使用 @Value
注解添加在属性的声明的上方,可以对属性注入值
直接注入值
@Value("陈加兵") private String name;
@Value("#{beanId.属性名}")
的注解时还可以使用Spring表达式 @Value(#{jdbc.url}) private String url;