spring概述(三)--依赖注入DI及简化Ioc

spring 个人记录

依赖注入

DI:Dependency Injection: 依赖注入
从字面上分析:
IoC:指将对象的创建权,反转到Spring容器;
DI :指Spring创建对象的过程中,将对象依赖属性通过配置进行注入
其实它们是同一个概念的不同角度描述。DI相对IoC而言,明确描述了“被注入对象依赖IoC容器配置依赖对象”。

对象注入的方式:

1):自动装配(了解)
2):手动注入(重点)
3):注解注入(重点)
通过哪些手段可以注入:
1):可以通过属性注入(setter方法).
2):通过构造器注入.
3):通过SpEL注入.
注入的时候,可有注入哪些类型的值.
1:简单类型(单一的值,使用value属性).
2:复合类型(JavaBean类型,使用ref属性)
3:集合类型(多个值,使用对应的集合标签)

使用setter注入(属性注入):

1,使用bean元素的property子元素设置;
1,简单类型值,直接使用value赋值;
2,复合类型,使用ref赋值;
3,集合类型,直接使用对应的集合类型元素即可。

2,spring通过属性的setter方法注入值;
3,在配置文件中配置的值都是string,spring可以自动的完成类型的转换
4,属性的设置值是在init方法执行之前完成的
5,改进spring的测试,直接在测试类里面注入需要测试的对象

使用DataSource(druid)的案例,给数据源注入Property中的数据.

准备:
MySQL驱动包和Druid连接池包.
druid-1.0.15.jar
mysql-connector-java-8.0.15.jar

  <context:property-placeholder location="db.properties" system-properties-mode="NEVER">
  </context:property-placeholder>
    <!-- 配置数据源-->
    <bean id="dataSurce" class="com.alibaba.druid.pool.DruidDataSource" 
    init-method="init" destroy-method="close">
        <property name="driverClassName" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
    </bean>

db.properties

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
username=root
password=123456

自动装配方式(不推荐):
设置:<bean />元素的:autowire属性:
<bean id="somebean" class="SomeBean全限定名" autowire="byType"/>
autowire属性:让spring按照一定的方式自己去找合适的对象,并完成DI
- default:不要自动注入
- no:不要自动注入
- byName:按照名字注入(按照属性的名字在spring中找bean) factory.getBean(“属性的名字”)
- byType:按照依赖对象的类型注入(factory.getBean(属性的类型))
- constructor:按照对象的构造器上面的参数类型注入
注意:
1,如果按照byName自动注入,要求所有的属性名字和id的名字必须保证一种规范的命名方式;
2,如果按照byType注入,如果spring中同一个类型有多个实例–>报bean不是唯一类型错误;

注解注入

 <!-- 开始DI注解解析程序-->
 <context:annotation-config/>

Spring提供的装配标签:
Autowired和Qualifier标签:
1.通过@Autowired标签可以让Spring自动的把属性需要的对象从Spring容器找出来,并注入给该属性。

2.第三方程序:Spring3.0之前,需要手动配置@Autowired解析注解程序,Spring就会自动的加入针对@Autowired标签的解析程序。从Spring3.0开始,可以不再需要改配置了。如果不在Spring的测试环境中,也找到@Autowired的解析代码,此时页必须配置.

3.@Autowired标签贴在字段或者setter方法上。

4.@Autowired可以同时为一个属性注入多个对象。
public void setXxx(OtherBean1 other1,OtherBean2 other2) {}

5.使用@Autowired标签可以注入Spring内置的重要对象,比如BeanFactory,ApplicationContext。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class SpringTest {
@Autowired
private ApplicationContext ctx;
}

6.默认情况下@Autowired标签必须要能找到对应的对象,否则报错。不过,可使用required=false来避免该问题:@Autowired(required=false)

7.@Autowired找bean的方式:
1)、首先按照依赖对象的类型找,如果找到则使用setter方法或者字段直接注入;
2)、如果在Spring上下文中找到多个匹配的类型,再按照名字去找,如果没有匹配则报错;
3)、可以通过使用@Qualifier(“otherBean”)标签来规定依赖对象按照bean的id+类型去找

@ToString
public class SomeBean {
    @Autowired
    @Qualifier("otherBean")  //<bean id=otherBean
    private OtherBean otherBean;
    @Resource
    private OtherBean2 otherBean2;
}

JavaEE提供的装配标签:

@Resource标签:
1,@Resource标签是JavaEE规范的标签;
2,@Resource标签也可以作用于字段或者setter方法;, 效果是跟autowired是一样的
3,也可以使用@Resource标签注入一些spring内置的重要对象,比如BeanFactory.ApplicationContext;
4,@Resource必须要求有匹配的对象;
5,context:annotation-config/既引入了@Autowired标签的解析器,也引入了@Resource的解析器;
6,@Resource标签找bean的方式:
1),首先按照名字去找,如果找到,就使用setter或者字段注入;
2),如果按照名字找不到,再按照类型去找,但如果找到多个匹配类型,报错;
3),可以直接使用name属性指定bean的名称;但是,如果指定的name,就只能按照name去找,如果找不到,就不会再按照类型去找

@Resource(name="otherBean2")
private OtherBean2 other2;
等价于
@Autowired
@Qualifier("otherBean2")
private OtherBean2 other2;

@Autowired VS @Resource:

1,@Autowired:是Spring定义的标签,所以不太稳定,并且对象和spring框架关联(Spring对我们的代码有侵入);
2,@Resouce:是J2EE的规范,所以稳定,在J2EE规范容器中也能正常使用;
在开发中两个注解都是一样的作用,所有选择谁都可以,完全取决于项目经理的选择

使用标签简化IoC:

1.使用标签来完成IoC,就必须有IoC标签的解析器:
使用context:component-scan来扫描spring需要管理的bean
base-package就告诉spring,去哪些包及其子包里去扫描bean,如果有多个包需要被扫描;只需要用逗号隔开多个包即可
<context:component-scan base-package=“com._520it.oa.dao,cn.com._520it.service” />
2.标注Bean的注解:@Component
默认情况,直接使用类的名字(首字母小写作为bean的名字)
如果要修改bean的名称;直接使用value属性来重新定义bean的名称
@Component(“otherbean”)
public class OtherBean {}
3.使用@Component的限制:
1),不能运用到静态工厂方法和实例工厂方法,但是可以使用到FactoryBean;
2),对于没有源代码的类(框架内部的预定义类),只能用XML配置;
4.bean组件版型标签
bean组件版型:
@Service用于标注业务层组件、
@Controller用于标注控制层组件(如struts中的action)
@Repository用于标注数据访问组件,即DAO组件。
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。

5.指定bean的作用域:@Scope(“prototype”)
6.初始化和销毁方法
@PostConstruct
public void init() {
相当于
@PreDestroy
public void destory() {
相当于

7.选用xml还是注解:
1),Annotation:使用方便,XML文件很小,但是,依赖关系又重新回到了代码当中;
2),XML:使用稍微复杂,但是,代码很干净,代码不会很任何框架产生关系;XML安全;
两种方式都必须掌握;

    <!-- 开始DI注解解析程序 如果不在Spring的测试环境中,也找到@Autowired的解析代码,此时页必须配置-->
    <context:annotation-config/>
    <!-- 限定属于哪个包中-->
    <context:component-scan base-package="com.gjd.domain"></context:component-scan>
@Component
public class User {
    private Long id;
    private String name;
    private BigDecimal salary;
//    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date hiredate;

    public void sayhello(){
        System.out.println("gjd");
    }
}
 @Autowired
    private User user;
发布了6 篇原创文章 · 获赞 0 · 访问量 182

猜你喜欢

转载自blog.csdn.net/hero_chao/article/details/103960228
今日推荐