Spring中的注解装配

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,按照名称进行注入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ヾ草木萤火(≧▽≦*)o

希望大家多多支持,我会继续分享

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值