一、属性注入
1、有参构造注入
public class PropertyDemo1{
private String username;
public PropertyDemo1(String username){
this.username=username;
}
public void test1(){
System.out.println(username);
}
}
bean1.xml中配置:
<bean id="demo" class="cn.itcast.property.PropertyDemo1">
<constructor-arg name="username" value="小王"></constructor-arg>
</bean>
2、set注入
public class Book{
private String bookname;
public void setBookname(String bookname){
this.bookname=bookname;
}
public void demobook(){
System.out.println("book..."+bookname);
}
}
public class TestIOC{
@Test
public void testUser(){
ApplicationContext context=ClassPathXmlApplicationContext("bean1.xml");
Book book=(Book)context.getBean("book");
book.demobook();
}
}
bean1.xml配置:
<bean id="book" class="cn.itcast.property.Book">
<property name="bookname" value="ysy"></property>
</bean>
3、注入对象类型属性:
1)在bean1.xml中配置:
<bean id="userDao" class="cn.itcast.ioc.UserDao"></bean>
<bean id="userService" class="cn.itcast.ioc.UserService">
<!--注入dao对象
现在不要写value 因为刚才使字符串现在是对象
name:service类里面属性名称
写ref属性:dao配置bean标签id值
-->
<property name="userDao" ref="userDao" ></property>
</bean>
2)UserService类
public class UserService{
private UserDao userDao;
public void setUserDao(){
this.userDao=userDao;
}
public void add(){
System.out.println("service...");
userDao.add();
}
}
public class UserDao{
public void add(){
System.out.println("userDao...");
}
}
public class TestIOC{
@Test
public void testUser(){
ApplicationContext context=ClassPathXmlApplicationContext("bean1.xml");
UserService userService=(UserService)context.getBean("userService");
userService.add();
}
}
4、p名称空间注入:
public class Person{
private String pname;
public void setPname(String name){
this.pname=pname;
}
public void test1(){
System.out.println("person..."+pname);
}
}
在bean1.xml中配置:
<bean id="person" class="cn.itcast.property.Person" p:pname="lucy"></bean>
5、注入复杂属性
public class Person{
private String pname;
private String[] arrs;
private List<String> list;
private Map<String,String> map;
private Properties properties;
public void setArrs(String[] arrs){
this.arrs=arrs;
}
public void setList(List<String> list){
this.list=list;
}
public void setMap(Map<String,String> map){
this.map=map;
}
public void setProperties(Properties properties){
this.properties=properties;
}
public void setPname(String name){
this.pname=pname;
}
public void test1(){
System.out.println("person..."+pname);
}
}
在bean1.xml中配置
<bean id="person" class="cn.itcast.property.Person" >
<!--数组-->
<property name="arrs">
<list>
<value>小王</value>
<value>小礼</value>
<value>小课</value>
</list>
</property>
<!--list 集合-->
<property name="list">
<list>
<value>小奥</value>
<value>小深</value>
<value>小得</value>
</list>
</property>
<!--map集合-->
<property name="map">
<map>
<entry key="aa" value="lucy">小奥</entry>
<entry key="bb" value="mary">小深</entry>
<entry key="cc" value="tom">小得</entry>
</map>
</property>
<!--properties-->
<property name="properties">
<pros>
<prop key="driverClass">com.mysql.jdbc.Driver</prop>
<prop key="username">root</prop>
</pros>
</property>
</bean>
二、spring的bean管理(注解方式)
1、注解写法:
@注解名称(属性名称=属性值)
2、注解适用范围:
类上面 方法上 属性上
3、spring注解开发准备:
1)导入jar包:
(1)导入基本的jar包
commons-logging-1.2.jar
log4j-1.2.16.jar
spring-beans-4.2.4.RELEASE.jar
spring-context-4.2.4.RELEASE.jar
spring-core-4.2.4.RELEASE.jar
spring-expression-4.2.4.RELEASE.jar
(2)导入aop的jar包
spring-aop-4.2.4.RELEASE.jar
2)创建类
@Component(value="user")
public class User{
public void add(){
System.out.println("add...");
}
}
public class TestAnno{
@Test
public void testUser(){
ApplicationContext context=new ClassPathXmlApplicationContext("bean1.xml");
User user=(User)context.getBean("user");
user.add();
}
}
3)创建spring配置文件 引入约束
(1)第一天做ioc基本功能 引入约束beans
(2)做spring的注解开发 引入新的context约束
<!--在配置文件只需要配置开启注解扫描:
(1)到包里面扫描类、方法、属性上面是否有注解
(2)base-package :要配置注解的类所在的包名
-->
<context :component-scan base-package="cn.itcast"></context:component-scan>
4)创建对象有四个注解:
@Controller :web层
@Service :业务层
@Repository :持久层
@Component
4、spring注解方式注入属性:
@Service(value="userService")
public class UserService{
@Autowired
private UserDao userDao;
public void add(){
userDao.add();
}
}
@Service(value="userService")
public class UserService{
@Resource(name="userService");
private UserDao userDao;
public void add(){
userDao.add();
}
}
@Seervice(value="userDao")
public class UserDao{
public void add(){
System.out.println("userDao。。。");
}
}
5、注解和配置文件混合使用:
1、创建对象使用配置文件实现
2、注入属性用注解实现
public class BookService{
@Resource(name="bookDao")
private BookDao bookDao;
@Resource(name="ordersDao")
private OrdersDao ordersDao;
public void add(){
System.out.println("service...");
}
}
public class OrdersDao{
public void buy(){
System.out.println("ordersdao...");
}
}
public class BookDao{
public void book(){
System.out.println("bookdao...");
}
}
public class TestAnno{
@Test
public void testService(){
ApplicationContext context=new ClassPathXmlApplicationContext("bean2.xml");
BookService bookService=(BookService) context.getBean("bookService");
bookService.add();
}
}
bean2.xml:
<!--开启注解扫描-->
<context:component-scan base-package="cn.itcast"></context:component-scan>
<!--创建对象-->
<bean id="bookService" class="cn.itcast.xmlanno.BookService"></bean>
<bean id="bookDao" class="cn.itcast.xmlanno.BookDao"></bean>
<bean id="ordersDao" class="cn.itcast.xmlanno.OrdersDao"></bean>
三、AOP
1、AOP:
采取横向抽取机制 取代传统纵向继承体系
2、AOP操作术语
1、Pointcut(切入点):
2、Advice(
3、spring的AOP操作:
1、在spring里面进行aop操作 s使用aspectjsshi实现
1)aspectj不是spring一部分 和spring一起使用进行aop操作
2)spring2.0以后x新增了对aspectj的支持
2、使用aspectj实现aop由两种方式
1)基于aspect的xml配置
2)基于aspect的注解
3、spring配置文件方式:
1、导入jar:
aopalliance-1.0.jar
aspectjweaver-1.8.7.jar
spring-aop-4.2.4.RELEASE.jar
spring-aspects-4.2.4.RELEASE.jar
2、创建spring核心配置文件、导入aop约束
bean3.xml:
<!--配置对象-->
<bean id="book" class="cn.itcast.aop.Book"></bean>
<bean id="myBook" class="cn.itcast.aop.MyBook"></bean>
<!--配置aop操作-->
<aop:config>
<!--2.1配置切入点 id:给切入点配置名字 自己取-->
<aop:pointcut expression="execution(* cn.itcast.aop.Book.*(..))" id="pointcut1"/>
<!--2.2配置切面 -->
<aop:aspect ref="myBook">
<aop:before method="before1" pointcut-ref="pointcut1"/>
<aop:after-returning method="after1" pointcut-ref="pointcut1"/>
<aop:after-returning method="around1" pointcut-ref="pointcut1"/>
</aop:aspect>
</aop:config>
3、使用表达式配置切入点
(1)execution(* cn.itcast.aop.Book.add(..));
(2)excution(*cn.itcast.aop.Book.*(..));
(3)excution(* *.*(..));
(4)excution(* save*(..));
public class Book{
public void add(){
System.out.println("add...");
}
}
public class MyBook{
public void befor1(){
System.out.println("前置增强..");
}
public void after1(){
System.out.println("后置增强..");
}
public void around1(ProceedingJoinPoint proceedingJoinPoint) throw Throwable{
System.out.println("方法之前...");
proceedingJoinPoint.proceed();
System.out.println("方法之后...");
}
}
public class TestAnno{
@Test
public void testService(){
ApplicationContext context=new ClassPathXmlApplicationContext("bean3.xml");
Book book=(Book)context.getBean("book");
book.add();
}
}
4、spring注解方式
1、创建类
public class Book{
public void add(){
System.out.println("add...");
}
}
@Aspect
public class MyBook{
@Before(value="execution(* cn.itcast.aop.Book.*(..))")
public void before1(){
System.out.println("before..");
}
}
public class TestAnno{
@Test
public void testService(){
ApplicationContext context=new ClassPathXmlApplicationContext("bean3.xml");
Book book=(Book)context.getBean("book");
book.add();
}
}
2、创建spring核心配置文件、导入aop约束
bean3.xml:
<!--配置对象-->
<bean id="book" class="cn.itcast.aop.Book"></bean>
<bean id="myBook" class="cn.itcast.aop.MyBook"></bean>
<!--开启aop操作-->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
四、spring的jdbcTemplate
1、jdbcTemplate对jdbc进行封装
2、增加 删除 修改 查询:
1)导入jar包
spring-jdbc-4.2.4.RELEASE.jar
spring-tx-4.2.4.RELEASE.jar
导入数据库驱动
2)创建对象 sh设置数据库信息
3)创建jdbcTemplate对象 设置数据源
4)调用jdbcTemplate模板方法
public class JdbcTemplateDemo1{
@Test
public void add(){
DriverManagerDateSource dataSource=new DriverManagerDateSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///spring_day03");
dataSource.setUsername("root");
dataSource.setPassword("root");
IdbcTemplate jdbcTemplate=new JdbcTemplate(dataSource);
String sql="insert into user value(?,?)";
int rows=jdbcTemplate.update(sql,"lucy","250");
}
@Test
public void update(){
DriverManagerDateSource dataSource=new DriverManagerDateSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///spring_day03");
dataSource.setUsername("root");
dataSource.setPassword("root");
IdbcTemplate jdbcTemplate=new JdbcTemplate(dataSource);
String sql="update user set password=? where username=?";
int rows=jdbcTemplate.update(sql,"1314","lucy");
}
@Test
public void delete(){
DriverManagerDateSource dataSource=new DriverManagerDateSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///spring_day03");
dataSource.setUsername("root");
dataSource.setPassword("root");
IdbcTemplate jdbcTemplate=new JdbcTemplate(dataSource);
String sql="delete from user where username=?";
int rows=jdbcTemplate.update(sql,"lucy");
}
@Test
public void testQuery(){
DriverManagerDateSource dataSource=new DriverManagerDateSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///spring_day03");
dataSource.setUsername("root");
dataSource.setPassword("root");
IdbcTemplate jdbcTemplate=new JdbcTemplate(dataSource);
String sql="select count(*) from user";
int count=jdbcTemplate.queryForObject(sql,Integer.class);
}
@Test
public void testObject(){
DriverManagerDateSource dataSource=new DriverManagerDateSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///spring_day03");
dataSource.setUsername("root");
dataSource.setPassword("root");
IdbcTemplate jdbcTemplate=new JdbcTemplate(dataSource);
String sql="select * from user where username=?";
User user=jdbcTemplate.queryForObject(sql,new MyRowMapper(),"mary");
}
}