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

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........

posted on 2018-08-30 14:18  legion  阅读(139)  评论(0编辑  收藏  举报

导航