Java web开发(15)Spring入门介绍

本文围绕Spring展开,介绍IOC入门案例,包括Bean标签的scope配置。阐述属性注入,有有参构造注入和Set方法注入对象类型属性。讲解@Autowired注解使用时可能出现的装配歧义性及解决方法,还介绍注解开发,如用注解替代bean配置、注解方式使用事务和注入属性。

IOC入门案例

 有User类

public class User {
public void add() {
        System.out.println("add..........");
    }
}

在Spring的配置文件bean1.xml中如下配置

<bean id="user" class="cn.itcast.ioc.User"></bean>

如下使用

ApplicationContext context = 
                new ClassPathXmlApplicationContext("bean1.xml");
User user=(User)context.getBean("user");
System.out.println(user);
user.add();

 

Bean的标签:scope

<bean id="user" class="cn.itcast.ioc.User" scope="prototype"></bean>

如果不配置scope默认为singleton

 

属性注入

有参构造注入

比如类PropertyDemo1,有属性username

private String username;
//有参构造函数
public PropertyDemo1(String username){
this.username=username;
}

通过如下配置为其注入属性

    <bean id="demo" class="cn.itcast.property.PropertyDemo1">
        <constructor-arg name="hello" value="小王小马"></constructor-arg>
    </bean>

 

Set方法注入对象类型属性

有类UserService

public class UserService {

    //1 定义dao类型属性
    private UserDao userDao;
    //2 生成set方法
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
    
    public void add() {
        System.out.println("service.........");
        userDao.add();
    }
}    
    <!-- 1 配置service和dao对象 -->
    <bean id="userDao" class="cn.itcast.ioc.UserDao"></bean>
    
    <bean id="userService" class="cn.itcast.ioc.UserService">

        <property name="userDao" ref="userDao"></property>
    </bean>

name :UserService中UserDao属性名称

ref,UserDao类在bean中的id值。

 Autowired介绍

使用@Autowired注解的过程中,如果出现NoUniqueBeanDefinitionException异常,大多是因为自动装配或者其他方式装配所导致的歧义性.即一个接口存在两个以上的实现类.即在自动装配的时候,可能出现因重名问题导致的NoUniqueBeanDefinitionException异常.

@Autowired是按类型进行装配的,那么我一个接口UserInterface,有多个实现类

AImpl(@service(name="userInterface1")),BImpl(@service(name="userInterface2")

等等这些实现类都加入了Spring容器,当在一个类中使用如下语句:

@Autowired
private IUserInterface userInterface;

在下面列举一下了一下,上述问题以及类似的装配歧义性解决问题方法. 

方法一

 

首先加上注解@Qualifier来区分不同的实例.通过在实现接口的类上通过value属性去命名不同的名称,对于@Repository、@Service 和 @Controller 和 @Component四个注解都有类似value属性可以设置,例如:

@Service(value="userServiceImpl")
public class UserServiceImpl implements IUserService{

}

@Autowired
@Qualifier("userServiceImpl")
private IUserService userServiceImpl;
方法二

因为一个借口存在两个以上的实现类,也可以通过标识首选哪个bean,来解决歧义性问题.例如:

@Component
@Primary
public class UserServiceImpl implements IUserService{

  }

此时,如果引用到了IUserService接口的实现类注入,则首先注入@Promary注解标注的类,但是此时有一个问题,在同一个接口的实现类中,你只能使用一次@Primary,如果对于AImpl和BImpl都使用了@primary,则还是会发生装配的歧义性.此时,建议使用(1)的方式来解决歧义性问题.

注解开发

目的:使用注解的方式替代bean配置

比如,上面的User可以改成如下

@Component(value="user")
public class User{
.....
}

说明:这个注解就等效于

<bean id="user" class="....">

Component,Service都是一个意思。

配置:在原来配置bean的文件中使用

<context:component-scan base-package="cn.itcast"></context:component-scan>

base-package可以学包名,也可以是开头为cn.itcast的所有包。

注解方式使用事务

    <!-- 第一步配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    
    <!-- 第二步 开启事务注解 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>

在需要使用事务的方法上面使用@Transactional

 注解方式注入属性

上面的UserService,不使用配置,使用注解改写成

@Component(value="id_of_dao")
public class UserDao {

    public void add() {
        System.out.println("dao.........");
    }
}

@Service(value="userService")
public class UserService {

  //这里可以使用@Autowired @Resource(name
="id_of_dao") private UserDao db; public void add() { System.out.println("service..........."); db.add(); } } // 测试代码 @Test public void testService() { ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml"); UserService userService = (UserService) context.getBean("userService"); userService.add(); } //输出 service........... dao........

转载于:https://www.cnblogs.com/legion/p/9559885.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值