spring学习之路(3) spring的依赖注入

本文详细解析了Spring框架中Bean的依赖注入方式,包括构造函数注入、set方法注入和注解注入。文章深入探讨了每种注入方式的特点、适用场景以及具体实现方法,并通过代码实例进行了说明。

bean.xml

<!--spring的依赖注入
        注入的方式有三种:
            1,使用构造函数注入
            2,使用set方法注入
            3.使用注解注入
        注入的数据类型有三种:
            1,基本类型和string类型
            2,其他bean类型
            3,复杂类型(集合类型) 
     -->
    <!-- 构造函数注入
        标签:constructor-arg
        涉及的属性:
            type:指定参数的类型
            index:指定参数的索引位置,从0开始
            name:指定参数的名称
            ==========上面三个属性是指定给哪个参数赋值,下面两个属性是指定给参数赋什么值===================
            value:指定基本数据类型或string类型的数据
            ref:指定其他bean类型数据
    -->
<bean id="customerService" class="service.impl.CustomerServiceImpl">
        <constructor-arg name="name" value="user"></constructor-arg>
        <constructor-arg name="password" value="123"></constructor-arg>
        <constructor-arg name="customerDao" ref="customerDao"></constructor-arg>
    </bean> <bean id="customerDao" class="dao.impl.CustomerDaoImpl"></bean> 

CustomerServiceImpl.class

public class CustomerServiceImpl implements CustomerService {
    private String name;
    private String password;
    private CustomerDao customerDao;

    /*
     * 构造函数注入
     * 提供构造函数让参数注入
     */
public CustomerServiceImpl(String name, String password,CustomerDao customerDao) {
    this.name = name;
    this.password = password;
    this.customerDao = customerDao;
    }

    public void saveCustomer(){
    System.out.println("业务层调用持久层   "+name+" "+password);
    customerDao.saveCustomer();
    }
}

bean.xml

<!-- set方法注入
        name:指定参数的名称
        value:指定基本数据类型或string类型的数据
        ref:指定其他bean类型数据
     -->

    <!-- <bean id="customerService" class="service.impl.CustomerServiceImpl">
        <property name="name" value="user"></property>
        <property name="password" value="123"></property>
        <property name="customerDao" ref="customerDao"></property>
    </bean> -->

CustomerServiceImpl.class

public class CustomerServiceImpl implements CustomerService {
    private String name;
    private String password;
    private CustomerDao customerDao;

    public void saveCustomer(){
    System.out.println("业务层调用持久层   "+name+" "+password);
    customerDao.saveCustomer();
    }

    /* set方法注入
     * 生成set方法以让数据注入
     */

   /* public void setName(String name) {
        this.name = name;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public void setCustomerDao(CustomerDao customerDao) {
        this.customerDao = customerDao;
    }
    */

}

bean.xml

<!-- 当配置了注解之后,要告知spring在创建容器时要扫描的包,配置了该标签后,spring才会去指定的包以及其子包下找相应的注解
 -->
     <context:component-scan base-package="service"></context:component-scan>
    <context:component-scan base-package="dao"></context:component-scan> 

CustomerServiceImpl.class

/*
 * 
 * 注解:
 * <bean id="customerService" class="service.impl.CustomerServiceImpl"></bean>
 * 创建bean对象
 *  @Component
 *      作用相当与配置一个bean标签,有一个id属性,默认为首字母小写的类名
 *  由此注解衍生了的三个注解:
 *      @Controller 用于表现层的注解
 *              @Service    用于业务层的注解
 *              @Repository 用于持久层的注解
 *      它们和@Component的作用和属性一模一样
 * 注入数据:
 *  @Autowired
 *      作用:自动按照类型注入
 *      如果注入的bean在容器中类型不唯一,即一个接口有多个实现类,它会把变量名作为bean的id,在容器中查找,找到后也能注入成功
 *      如果没有找到一致的id,就会报错
 *      @Qualifier
 *      作用:在自动按照类型注入的基础上,再按照bean的id注入       
 *      属性:
 *          value:用于指定bean的id
 *  @Resource
 *      作用:直接按照id进行注入   
 *      属性:
 *          name:用于指定bean的id
 *  以上三个注解都是用于注入其他bean类型,而注入基本数据类型和string类型用@Value
 *  @Value
 *      属性:
 *          value:用于指定要注入的数据
 *  它可以借助spring中的el${}表达式读取properties文件中的配置    
 *  
 * 改变作用范围:
 *  @Scope  
 *       作用:用于改变bean的作用范围
 * 
 */
@Service("customerServiceImpl")
public class CustomerServiceImpl implements CustomerService {
    @Value("aaa")
    private String name;
    @Value("123")
    private String password;

    //@Resource(name="customerDaoImpl")
    //@Qualifier("customerDaoImpl")
    @Autowired
    private CustomerDao customerDao;


    public void saveCustomer(){
    System.out.println("业务层调用持久层   "+name+" "+password);
    customerDao.saveCustomer();
    }    
}

bean.xml文件可以用一个class代替

/*
 * 一个spring的配置类,相当于bean.xml
 */

//@Configuration//他就是把当前类看出spring的配置类,一般也可以不用
@ComponentScan({"service","dao"})
public class SpringConfiguration {

}
【最优潮流】直流最优潮流(OPF)课设(Matlab代码实现)内容概要:本文档主要围绕“直流最优潮流(OPF)课设”的Matlab代码实现展开,属于电力系统优化领域的教学与科研实践内容。文档介绍了通过Matlab进行电力系统最优潮流计算的基本原理与编程实现方法,重点聚焦于直流最优潮流模型的构建与求解过程,适用于课程设计或科研入门实践。文中提及使用YALMIP等优化工具包进行建模,并提供了相关资源下载链接,便于读者复现与学习。此外,文档还列举了大量与电力系统、智能优化算法、机器学习、路径规划等相关的Matlab仿真案例,体现出其服务于科研仿真辅导的综合性平台性质。; 适合人群:电气工程、自动化、电力系统及相关专业的本科生、研究生,以及从事电力系统优化、智能算法应用研究的科研人员。; 使用场景及目标:①掌握直流最优潮流的基本原理与Matlab实现方法;②完成课程设计或科研项目中的电力系统优化任务;③借助提供的丰富案例资源,拓展在智能优化、状态估计、微电网调度等方向的研究思路与技术手段。; 阅读建议:建议读者结合文档中提供的网盘资源,下载完整代码与工具包,边学习理论边动手实践。重点关注YALMIP工具的使用方法,并通过复现文中提到的多个案例,加深对电力系统优化问题建模与求解的理解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值