1.关于Spring中的注解装配的作用
Spring中的注解装配简化了xml中bean的配置,大大提高了开发效率。
原本我们想在spring容器中使用某个类需要先在xml中配置该类的bean。使用注解后可以直接通过包扫描的方式自动在我们调用类时自动装配。
例如:
当我们想要使用UserDaO实现类时需要再Xml配置文件上添加如下配置
<bean id="userDao" class="com.yc.dao.impl.UserDaoImpl" />
但是到我们在类上添加注解:@complicate一样可以到达上述xml的效果
@Repository("userDao") public class UserDaoImpl implements UserDao { @Override public void getUser() { System.out.println("注解测试==>、、、"); return ; } }
xml中的
<bean class="com.xxxx" />就相当于===》@Repository()
而<bean id="userDao" /> 就箱单于==》@Repository("userDao")
但为了可以识别到我们的注解需要再xml中配置包扫描:
<context:component-scan base-package="com.yc"/>//此处的包要写成自己对应的项目包
如此一来bean的配置也就大大简化,提高了开发效率。
2.Ioc中的注解:
注解 | 说明 |
---|---|
@Component | 使用在类上用于实例化Bean 相当于 <bean></bean> |
@Controller | 使用在web层类上用于实例化Bean |
@Service | 使用在service层类上用于实例化Bean |
@Repository | 使用在dao层类上用于实例化Bean |
需要注意的是:使用注解时,当类级别注解不指定具体的 bean 名称时,Spring 会使用类的名称(byname)作为 bean 的名称,比如UserDaoImpl的类加上注解@Repository,而不设置注解参数时,spring会默认以userDaoImpl作为该bean的 id。所以在使用过程中应该注意。
例如:
你会发现注解不设置参数时
@Repository public class UserDaoImpl implements UserDao { private User user; public void setUser(User user){ this.user=user; } @Override public void getUser() { System.out.println("注解测试==>、、、"); return ; } }
当我通过测试类去调用时,控制台就会报错,显示找不到bean。
测试类如下:
@Test public void Springtest2(){ ClassPathXmlApplicationContext cac=new ClassPathXmlApplicationContext("springConfig.xml"); UserDao userDao=cac.getBean(UserDaoImpl.class); userDao.getUser(); System.out.println("````"); }
而加上(“userDao”)便可以找到
@Repository("userDao") public class UserDaoImpl implements UserDao { private User user; public void setUser(User user){ this.user=user; } @Override public void getUser() { System.out.println("注解测试==>、、、"); return ; } }
原因:
在 Spring 框架中,
@Repository
注解用于标识一个类属于数据访问层(DAO)的组件。默认情况下,Spring 会按照类型来查找并创建相应的 bean 实例。在示例中,当类级别注解
@Repository
不指定具体的 bean 名称时,Spring 使用类的名称(byname)作为 bean 的名称此处的例子即以userDaoImpl作为其名称而不是以userDao为名称,所以在容器扫描识别时才会显示找不到userDao的bean,容器只扫描到userDaoImpl的bean。因此,如果你的类名为UserDaoImpl
,那么根据默认的查找规则,Spring 将会寻找一个名为 "userDaoImpl" 的 bean。对于第一个示例中的类:
@Repository public class UserDaoImpl implements UserDao { // ... }
如果未在
@Repository
注解中指定 bean 的名称,Spring 默认会使用类名小写(camelCase)。因此,它将在上下文中查找名为 "userDaoImpl" 的 bean。如果找不到与该名称匹配的 bean,就会出现找不到 bean 的错误。而对于第二个示例中的类:
java
@Repository("userDao") public class UserDaoImpl implements UserDao { // ... }
@Repository
注解指定了具体的 bean 名称为 "userDao",这意味着 Spring 在上下文中查找名为 "userDao" 的 bean,并成功创建了实例。综上所述,注解
@Repository
的查找方式实际上是基于 bean 的名称(byname)进行查找的。你可以通过显式指定@Repository
注解的值,来定制 bean 名称并避免找不到 bean 的错误。
3.DI注解
注解 | 说明 |
---|---|
@Autowired | 使用在字段上用于根据类型依赖注入,相当于 <property></property> ,根据类型注入。底层使用反射 |
@Qualifier | 结合@Autowired一起使用,不能单独使用。根据id查找同类型下的实例 |
@Resource | 相当于@Autowired+@Qualifier,按照名称进行注入 |