Spring -- 依赖注入,注解替代

文章详细介绍了Spring框架中不同类型的依赖注入方式,包括setter注入、构造器注入、自动装配以及集合注入。setter注入通过property标签和ref属性进行,构造器注入基于构造方法参数。自动装配允许按类型或按名称装配bean。此外,文章还提到了使用注解进行bean定义和扫描,简化配置文件的方式。
摘要由CSDN通过智能技术生成

 

 setter注入,这里面protery的nam对象就是你那个类属性的名字,而ref就是你要set方法传参的值。 ref可以换成value就是基本数据类型和String。

setter注入

/ *  UserServiceIml代码 */ 太多没有,就展示部分重要的


public class UserServiceImpl implements UserService {
    private UserDao userDao;
    private BookDao bookDao;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }

}
 / * AppapplacionContext  */

<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>

    <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>

    <!--注入引用类型-->
    <bean id="userService" class="com.itheima.service.impl.UserServiceImpl">
        <!--property标签:设置注入属性-->
        <!--name属性:设置注入的属性名,实际是set方法对应的名称-->
        <!--ref属性:设置注入引用类型bean的id或name-->
        <property name="userDao" ref="userDao"/>
        <property name="bookDao" ref="bookDao"/>
    </bean>
<!--     ref就是你要引用的id吗,他负责帮你创建class -->

构造器注入

 

<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
        <!--根据构造方法参数位置注入-->
        <!-- 构造器注入除了name属性还有,type和index -->
        <constructor-arg index="0" value="mysql"/>
        <constructor-arg index="1" value="100"/>
    </bean>



构造器注入对比setter注入实际上相比,构造器name属性对应构造器的参数名,而seter对应的属性名,另外。
构造器注入强制依赖性,也就是说适合程序一开始创建,就不用改的场景。而seter无所谓,只要属性名不改即可。中间seeter代码改不改无所谓。

 自动装配注入

支持引用数据类型的自动装配,建议按照类型,去配置文件搜索有没有适合这个bean但是相应的seter方法要保留。

<bean id="bookDao"  class="com.itheima.dao.impl.BookDaoImpl"/>
    <!--autowire属性:开启自动装配,通常使用按类型装配,他会自动找,-->
    <!-- 如果多个名字,就是按按名字注入,但是不推荐,byName是按照属性的的名字去找对应的id名字 -->
    <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl" autowire="byType"/>

集合注入

   <!--数组注入-->
        <property name="array">
            <array>
                <value>100</value>
                <value>200</value>
                <value>300</value>
                <!-- <ref bean="bookDaoId"/> 
             // 引用类型几乎不会用
当参数-->

            </array>
        </property>
        <!--list集合注入-->
        <property name="list">
            <list>
                <value>itcast</value>
                <value>itheima</value>
                <value>boxuegu</value>
                <value>chuanzhihui</value>
            </list>
        </property>
        <!--set集合注入-->
        <property name="set">
            <set>
                <value>itcast</value>
                <value>itheima</value>
                <value>boxuegu</value>
                <value>boxuegu</value>
            </set>
        </property>
        <!--map集合注入-->
        <property name="map">
            <map>
                <entry key="country" value="china"/>
                <entry key="province" value="henan"/>
                <entry key="city" value="kaifeng"/>
            </map>
        </property>
        <!--Properties注入-->
        <property name="properties">
            <props>
                <prop key="country">china</prop>
                <prop key="province">henan</prop>
                <prop key="city">kaifeng</prop>
            </props>
        </property>
    </bean>

案例:数据源对象管理

如要建一个druild的DruidDataSource对象,建一个数据库连接池,首先这个,

1.我们是不是要提供url,name等基本数据才能连上..

2. 这个DruidDataSource,并不是我们自己写的,所以用setter或者构造方法注入传入url等信息,是不是要看他怎么写的?

3.进入里面+双击 shirt 能搜索里面所有的方法,ctrl + H : 能看当前类的继承以及实现关系

等一下,这个数据库连接到后面用Mybatis注解开发,但是但是有利于理解前面的知识点。所看一下,了解原理即可。

 开启context明明空间,将jdbc的配置文件单独隔离出来,

 

 

jdbc.properties 的配置文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/spring_db
jdbc.username=root
jdbc.password=root

容器

 

 总结:

 

 bean注解开发

 

 

 ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
//------ applicationContext.xml

 <context:component-scan base-package="com.itheima"/>

这2相同

//声明当前类为Spring配置类
@Configuration
//设置bean扫描路径,多个路径书写为字符串数组格式
@ComponentScan({"com.itheima.service", "com.itheima.dao"})
public class SpringConfig {
}

 

AppForAnnotation.java

ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
        //ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        //BookDao bookDao = (BookDao) ctx.getBean("bookDao");
        //System.out.println(bookDao);
        //按类型获取bean
        BookService bookService = ctx.getBean("BookService");
        System.out.println(bookService);


BookServiceImpl.java


//@Component定义bean
//@Component
//@Service:@Component衍生注解
@Service("bookService")
// 卧槽,有的话。有id等同与那个就是默认创建这个
public class BookServiceImpl implements BookService {
    private BookDao bookDao;

    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }

    public void save() {
        System.out.println("book service save ...");
        bookDao.save();
    }
}
//@Component定义bean
//@Component("bookDao")
//@Repository:@Component衍生注解
@Repository("bookDao")
public class BookDaoImpl implements BookDao {
    public void save() {
        System.out.println("book dao save ...");
    }
}
// SpringConfig.java


//声明当前类为Spring配置类
@Configuration
//设置bean扫描路径,多个路径书写为字符串数组格式
@ComponentScan({"com.itheima.service", "com.itheima.dao"})
public class SpringConfig {
}
 我们希望Spring给我们提供2个bean对象,并且第一个servicebean,要通过set注入或者构造方法注入,来获取daobean
        采用组件化扫描,扫描com.iteheimna包,看到component(衍生注解),你可以指定一个id,给我们new 相应的对象, class="com.itheima.dao.impl.BookDaoImpl"
        把这个省略,就这样把bean配置取代,把整个配置文件取代,通过检测我们set注入方法,检测我们需要啥,再配置注解,给我new bean
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

本郡主是喵

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值